17

I have a website that is very simple, but very long -- a lot of text that could be scrolled through. It's a documentation site, and considering the nature of the content (a lot of short similar entries) I decided to show everything at once, so the user could either scroll from entry to entry or navigate via a sidebar index. It's a common documentation model that I like (e.g. Underscore, Backbone, and LoDash).

The site is here: http://davidtheclark.github.io/scut/. You could look at the pre-production code here: https://github.com/davidtheclark/scut/tree/master/docs/dev.

And here's the problem: For a number of users this site consistently crashes their iOS browsers. Not all users (not me); but for those that do experience the crash, it seems to recur consistently. (The site may also crash some people's Android phones, I don't know: haven't heard from any Android users.) I am hoping someone can help me diagnose and possibly fix this problem.

Part of the difficulty I have is that I cannot reproduce the crash myself -- not on my own iOS devices, not on the Xcode simulators. Because the site is not at all resource-heavy (~70KB load) and involves very little JavaScript, and because of the effects of a few prior attempts to fix this, I'm guessing that the problem involves memory usage -- that iOS browsers are crashing because the site is demanding too much memory. But I'm not sure that's the issue, and if it is I'm not sure how I can fix it.

I'm not sure what to try next, and I'm hoping some savvy StackOverflow whizzes have advice. What is it about this site, which seems so simple and basic to my eyes, that is making it so memory-demanding that it is crashing browsers?

Is it just too long? Is there CSS that is too difficult to render? Are there JavaScript memory leaks?

I'm interested both for the sake of this particular site and so that I can learn to anticipate-and-prevent and/or diagnose-and-fix similar problems on other sites in the future.

Feel free to look at or contribute to [the Github issue](in this Github issue, as well.

Addendum

Here are some things to know about the site that might be relevant:

  • The HTML doc is large relative to other sites' HTML docs. Unminified it looks to be ~225KB. (I notice that LoDash docs are even bigger -- does that site crash people's phones?)
  • The served HTML doc is minified.
  • Served CSS and JS are also minified.
  • The site uses Prism.js for syntax highlighting.
  • The site uses Overthrow to make the 2-scrolling-columns layout work on tablets.
  • <aside id="help-content"> is fixed and translated off-screen; it slides in when you click a [?] like the one by any utility's "use-name".

An iOS Crash Log

These look to me to be the potentially relevant lines of a crash report from an iPhone running Chrome and crashing on the site (I'm not sure whether they are actually relevant or not because I haven't developed iOS apps and don't know the ins-and-outs of these reports):

Free pages:                              5674
Active pages:                            117674
Inactive pages:                          55121
Speculative pages:                       3429
Throttled pages:                         0
Purgeable pages:                         0
Wired pages:                             60906
File-backed pages:                       23821
Anonymous pages:                         152403
Compressions:                            356216
Decompressions:                          121241
Compressor Size:                         16403
Uncompressed Pages in Compressor:        49228
Largest process:   Chrome

[...]

Chrome &lt;2a759438c2253e3baededaa0d13feb56&gt;       166479           166479  200  [per-process-limit] (frontmost) (resume)
Xan
  • 74,770
  • 16
  • 179
  • 206
davidtheclark
  • 4,666
  • 6
  • 32
  • 42

8 Answers8

14

I think I fixed it!

The problem, as suspected, was rendering/painting caused by CSS layout. At phone-size, I had been hiding the content of each entry until it was selected; and the method I had been using to hide them, and remove any trace of them from the layout, included position: absolute. I didn't initially use display: none because of typical concerns about wanting to not see content but keep it there, for various readers and reasons. I threw those concerns aside and changed the layout so that the entries were hidden with display: none and shown with display: block -- and that seems to have fixed the crashing.

I think the absolute positioning was stacking a huge amount of content in the corner of the screen, and although it wasn't visible, it was demanding memory.

What clued me in to trying this was an answer to another related question, linked to above by @tea_totaler: https://stackoverflow.com/a/14866503/2284669. It says:

What tends to help me a lot is to keep anything that is not visible at this time under display: none. This might sound primitive but actually does the trick. It's a simple way to tell the renderer of the browser that you don't need this element at this time and therefore releases memory. This allows you to create mile long vertical scrollers with all sorts of 3d effects as long as you hide elements that you are not using at this time.

I think that my other hiding method was not releasing memory, despite its other advantages (which were possibly irrelevant to this particular site anyway). I'm sure it became a problem only because the site was so long.

That's something to consider, though, when you want to hide an element: rendering/memory demands.

Community
  • 1
  • 1
davidtheclark
  • 4,666
  • 6
  • 32
  • 42
  • 2
    I had a similar situation - a menu for mobile devices that was "outside" view and appeared when a user click on a button. The website crushes on ipad and iphone. The fix was putting a display:none on that menu and add a .show() in javascript when it was needed. So display:none was the answer since " It's a simple way to tell the renderer of the browser that you don't need this element at this time and therefore releases memory" – Crerem Sep 01 '15 at 14:07
5

On my site it was caused by elements with the css property -webkit-backface-visibility: hidden

removing this property fixed all crashes!

see iOS: Multiple divs with -webkit-backface-visibility:hidden crash browser when zooming

Community
  • 1
  • 1
lloiser
  • 1,161
  • 9
  • 11
2

I ran an audit with Chrome on the site. It suggested this:

Remove unused CSS rules (44)
44 rules (10%) of CSS not used by the current page.
css-built.min.css: 10% is not used by the current page.


    audio, canvas, video  
    audio:not([controls])  
    [hidden]  
    abbr[title]  
    dfn  
    hr  
    mark  
    q  
    sub, sup  
    sup  
    sub  
    svg:not(:root)  
    figure  
    fieldset  
    legend  
    button[disabled], html input[disabled]  
    input[type=checkbox], input[type=radio]  
    input[type=search]  
    input[type=search]::-webkit-search-cancel-button, input[type=search]::-webkit-search-decoration  
    textarea  
    table  
    .older-docs  
    .older-docs>li  
    .older-docs>li:not(:last-child):after  
    *, :before, :after  
    fieldset  
    textarea  
    :not(pre)>code[class*=language-], pre[class*=language-]  
    :not(pre)>code[class*=language-]  
    .namespace  
    .token.regex, .token.important  
    .token.important  
    .older-docs  
    .changelog dt  
    .changelog>dt  
    .changelog>dt:after  
    .changelog>dd  
    .changelog-i-list  
    :target>.entry-body  
    .sub--h  
    .example--css.is-active  
    .preload .help-content-c  
    .help-content-c.is-active  
    .help-content.is-active  

The task manager on Chrome shows that the page takes up about 2x as much total memory than other sites, such as stackoverflow and dropbox. I would recommend dividing up the features into separate pages instead of one long page. By separating the features it would improve the server's efficiency and the browser's load time and memory usage. There would be less JavaScript and CSS running on each page and smaller amounts of data would be sent from the server. Having all the features on the home page is inefficient. For example, if a user only needed to look up how to make a Font Icon Label they would have to load other sections of the page that are not needed and take up memory.

tzengia
  • 352
  • 5
  • 12
  • How do you run this...? – TastySpaceApple Jan 01 '14 at 22:16
  • Go into Google Chrome or Chromium. Go to the page you wish to audit. Right-click -> Inspect Element On the menubar that pops up click on Audits Click run. – tzengia Jan 02 '14 at 00:27
  • Thanks for the look. A couple of points to respond to: Be careful with that CSS audit, because it is pretty aggressive and not wholly reliable without further consideration. Some of the rules are indeed relics of prior iterations and should be removed, or irrelevant parts of normalize.css, but a good chunk of those are in fact *used* -- though they might not be active at the moment that Chrome ran the audit (e.g. all those "is-active" items get triggered on and off by JS). (I'll have to continue in another comment ...) – davidtheclark Jan 02 '14 at 01:43
  • But also **I'm pretty sure that the size of the CSS and JS is not the issue, because they are tiny**: CSS just 20.9KB, JS just 3.6KB. As mentioned, all the assets that get served are under 70KB -- way, way smaller than pages on most sites. *The size of the HTML document itself, though, is 42.4 KB minified, larger than most documents* -- so although I doubt that would affect the server, loadtime, etc, it might affect rendering, paints, etc? I do think "memory usage" is an issue, but not in the sense of having large assets: more like rendering burdens or JS leaks or something similarly tricky. – davidtheclark Jan 02 '14 at 01:58
  • Along with the above audit, you can also do some very useful memory profiling, inspection etc., with Chrome. The course @Paul-Irish did for codeschool.com is very helpful http://discover-devtools.codeschool.com/ The videos can also be found here https://developers.google.com/chrome-developer-tools/docs/videos – Justin Jan 10 '14 at 20:21
  • Thanks for the tip Justin. I have been trying to use the Chrome DevTools timeline etc. to find the kinds of issues that @Paul-Irish and other Google evangelists write great posts about. It may be that the memory of my laptop running Chrome is so much faster than phones -- but I don't currently see recognizable issues. It's quite true, though, that I have limited understanding of more advanced applications of those tools -- so if there's any specific measurement you can see that indicates an issue I can fix, please do let me know! – davidtheclark Jan 10 '14 at 21:19
2

Sorry for just making a guesses but I see two potential causes in your stylesheet which could be resulting in crash

1.) Using data-url for background image rendering such as here

.github,.source {
background-image: url("data:image/svg+xml;charset=US-ASCII,%3Csvg%20width%3D%22100%22%20height%3D%22100%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M85.714%2050q0%2014.007-8.175%2025.195t-21.122%2015.485q-1.507.279-2.204-.391t-.698-1.674v-11.775q0-5.413-2.902-7.924%203.181-.335%205.72-1.004t5.246-2.176%204.52-3.711%202.958-5.859%201.144-8.398q0-6.752-4.408-11.496%202.065-5.078-.446-11.384-1.563-.502-4.52.614t-5.134%202.455l-2.121%201.339q-5.19-1.451-10.714-1.451t-10.714%201.451q-.893-.614-2.372-1.507t-4.66-2.148-4.799-.753q-2.455%206.306-.391%2011.384-4.408%204.743-4.408%2011.496%200%204.743%201.144%208.371t2.93%205.859%204.492%203.739%205.246%202.176%205.72%201.004q-2.232%202.009-2.734%205.748-1.172.558-2.511.837t-3.181.279-3.655-1.2-3.097-3.488q-1.06-1.786-2.706-2.902t-2.762-1.339l-1.116-.167q-1.172%200-1.618.251t-.279.642.502.781.725.67l.391.279q1.228.558%202.427%202.121t1.758%202.846l.558%201.283q.725%202.121%202.455%203.432t3.739%201.674%203.878.391%203.097-.195l1.283-.223q0%202.121.028%204.967t.028%203.013q0%201.004-.725%201.674t-2.232.391q-12.946-4.297-21.122-15.485t-8.175-25.195q0-11.663%205.748-21.512t15.597-15.597%2021.512-5.748%2021.512%205.748%2015.597%2015.597%205.748%2021.512z%22%2F%3E%3C%2Fsvg%3E");
background-repeat: no-repeat;
}

2.) Also -webkit-transition could be the culprit. Read here for more https://stackoverflow.com/a/11833285/900132

Community
  • 1
  • 1
anuj_io
  • 2,043
  • 2
  • 13
  • 19
1

Your HTML markup has some errors (such as a div tag inside an h1 tag) that should be fixed before you try to analyze a crash.

I suggest you run it through an HTML validator, for example http://validator.w3.org/check?uri=http%3A%2F%2Fdavidtheclark.github.io%2Fscut%2F&charset=%28detect+automatically%29&doctype=Inline&group=0

The div inside h1 apparently caused a cascade of errors that the validator had to suppress to continue.

When I have browser crashing problems, HTML validation is always my first step. Then I try seeing what might be wrong with the javascript if correcting the HTML didn't help.

Anachronist
  • 1,032
  • 12
  • 16
  • +1 I highly agree on fixing all basic errors in the code before trying to analyse this any further! – Andreas Jan 10 '14 at 21:04
  • Thanks for looking into that. Fixed the validation errors. Crashing is still happening, though -- so no luck. So I'm still thinking it's a memory issue caused by rendering (or, I don't know how, JS). – davidtheclark Jan 10 '14 at 21:12
  • After HTML validation, there's also CSS validation that you can do. And I see from your final answer that CSS was indeed the source of your problem. Glad to know you fixed it. – Anachronist Jan 14 '14 at 16:08
  • lol if it this as IE it might have been valid :) validation errors generally don't cause a website to crash :)) – OZZIE Oct 10 '15 at 14:48
0

I just read this post and tried http://davidtheclark.github.io/scut/ on my iPad. Chrome crashes immediately, although sometimes shortly shows the home page. Safari renders the home page correct and many other pages, but clicking on the "about > installation" link at the left makes it crash right away (well, once it displayed OK, but clicking again crashed it). All of this is pretty consistent.

The errors are indeed due to LowMemory and it's the browser process that uses the most memory. The crashes happen at around 150000 pages (4KB/page? => 600MB???).

That being said, I'm afraid I don't have an answer to your question. Hope it helps at least a little bit.

Kind regards, /Sigiswald

Ziggy
  • 83
  • 8
  • Dang, you're right: my fix only applied to the narrow-width layout, in which elements were hidden and the method of hiding needed to be changed. The iPad though is wide enough for the full version, without hidden elements, which means that the fix make a different for it. Ugh ugh ugh. – davidtheclark Jan 30 '14 at 01:58
  • On my iPad it looks like on the Backbone/Underscore docs you can't scroll through the sidebar nav, and the LoDash docs simply don't work. Maybe this style of documentation just won't work on these tablet devices? – davidtheclark Jan 30 '14 at 02:03
0

Removing position: sticky; helped me and my mobile safari crashing issues. Not sure exactly why.

body:before{
    position:-webkit-sticky;
    position:sticky;
}
teewuane
  • 5,524
  • 5
  • 37
  • 43
0

In my case the crashing was caused by using CSS filter: blur(2px) to create a colored "glow" effect.

I fixed it by creating the glow in photoshop and using a PNG file to render the glow on my website.

This not only fixed the crash but created a nicer, more even glow that also didn't re-render in strange ways when zooming and scrolling.

parliament
  • 21,544
  • 38
  • 148
  • 238