Итак, я бегу Java-сервер (в частности Winstone: http://winstone.sourceforge.net/)У Java заканчивается память, хотя я даю ей много!
Как это: Java -server -Xmx12288M -jar /usr/share/java/winstone-0.9.10.jar --useSavedSessions = false --webappsDir =/var/servlets --commonLibFolder =/usr/share/java
Это хорошо работало в прошлом, но теперь ему нужно загрузить в память больше материала в память, чем раньше.
Нечетная часть состоит в том, что в соответствии с «вершиной» она имеет 15,0 г виртуальной памяти (VIRT) и ее RES (набор идентификаторов) составляет 8,4 г. Как только он достигает 8,4 г, процессор висит на 100% (даже несмотря на то, что он загружается с диска), и в итоге я получаю OutOfMemoryError от Java. Предположительно, процессор, нависший на 100%, - это Java, делающий сборку мусора.
Итак, мой вопрос: что дает? Я дал ему 12 гигов памяти! И он использует только 8,2 концерта, прежде чем бросает в полотенце. Что я делаю не так?
О, и я использую Java версии "1.6.0_07" Java (TM) SE Runtime Environment (сборка 1.6.0_07-b06) Java HotSpot (TM) 64-разрядного сервера VM (сборка 10.0- b23, смешанный режим)
на Linux.
Спасибо, Matt
Если эти 8,4 ГБ размещены в «середине» этих 12 ГБ, и программа пытается выделить блок размером 3 ГБ за один раз, может быть, такого не существует такой блок смежных, свободных Память. Это заставляет GC работать, чтобы попытаться освободить некоторые вещи, но если он не сможет освободить достаточно памяти, чтобы найти этот блок, тогда он будет опускаться, хотя он должен технически быть свободным. –
GC должен перемещать память. –
То, что он добавляет, не особо велико. Это куча текстовых файлов (bunch = ~ 25-50 000). Поэтому не похоже, что он пытается выделить большой блок памяти. Хотя, возможно, это поражает некоторые проблемы фрагментации ...? GC должен очистить это, правда? – spitzanator