Хотя я не тестировал G1 в производстве, я подумал, что прокомментирую, что GC уже проблематичны для случаев без "огромных" куч. В частности, GC может серьезно повлиять на услуги, скажем, на 2 или 4 гигабайта. ГХ молодого поколения обычно не представляют проблем, поскольку они заканчиваются за однозначные миллисекунды (или самое большее двузначные). Но коллекции старого поколения гораздо более проблематичны, так как они занимают несколько секунд с размерами старого поколения от 1 гига и выше.
Теперь: теоретически CMS может сильно помочь, поскольку он может выполнять большую часть своей работы одновременно. Однако со временем будут случаи, когда он не сможет этого сделать и вынужден будет прибегнуть к помощи коллекции «Остановить мир». И когда это произойдет (скажем, через 1 час - не часто, но все же слишком часто), хорошо, держитесь за свои чертовы шляпы. Это может занять минуту или больше. Это особенно проблематично для служб, которые пытаются ограничить максимальную задержку; вместо того, чтобы потребовать, скажем, 25 миллисекунд для обработки запроса, теперь требуется десять секунд или больше. Чтобы добавить травму к оскорблению, клиенты будут часто тайм-аут запроса и повторять попытки, что приведет к дальнейшим проблемам (иначе как «дерьмо буря»).
Это одна из областей, где G1 надеялся сильно помочь. Я работал в большой компании, которая предлагает облачные сервисы для хранения и отправки сообщений; и мы не могли использовать CMS, так как, хотя большую часть времени она работала лучше, чем параллельные, у нее были эти провалы. Так около часа все было хорошо; и затем что-то попало в вентилятор ... и поскольку сервис основывался на кластерах, когда один узел попадал в беду, другие обычно следовали (поскольку тайм-ауты, вызванные GC, приводят к тому, что другие узлы полагают, что узел вышел из строя, что приводит к перенаправлению).
Я не думаю, что GC является большой проблемой для приложений, и, возможно, даже на некластеризованные сервисы это влияет реже. Но все больше и больше систем кластеризуются (особенно благодаря хранилищам данных NoSQL), и размеры кучи растут. GC OldGen суперлинейно связаны с размером кучи (это означает, что удвоение размера кучи более чем удваивает время GC, при условии, что размер набора данных в реальном времени также удваивается).