|
|
Публикувано в 14.08.2017 г. 16:49:22 ч.
|
|
|
|

Възникна грешка по време на инициализацията на виртуалната машина Не успях да резервирам достатъчно място за купчина обекти от 3145728KB
Наскоро работя по програма за Java. Първоначално винаги съм харесвал управлението на паметта в Java, няма нужда да се притесняваш за разпределяне на паметта, просто разпределяй, събирачът на боклук ще си върне паметта вместо теб. Сега програмата е разработена с голямо количество данни и за бързина ще заредя цялата информация в паметта, което ще гарантира бърз отговор. Все още броя паметта многократно, мисля за собственото си количество данни, което би трябвало да е достатъчно в началото (машината ми има 4G памет, въпреки че Windows разпознава 3.5G, но би трябвало да е наред в сравнение с текущия ми обем данни).
Неочаквано, програмата на първия експеримент продължи няколко часа и се натъкна на изключение за изчерпване на паметта. Гледайки собствените си настройки на виртуалната машина, зададох -Xms512M -Xmx1024M. Без да се замисля, директно го промених на -Xms512M -Xmx2048M, и резултатът беше, че не можах да запазя достатъчно място за object heap. Програмата не може да се изправи. Тогава осъзнах, че все още има ограничение за оригиналната максимална памет. Търсих в интернет и намерих много статии, обсъждащи този въпрос. Накрая намерих най-полезната статия във форума на BEA DEV2DEV
Тук модераторът YuLimin направи теста и стигна до заключението:
Фирмена JVM версия Максимална памет (мега) клиент Максимална памет (мега) сървър
SUN 1.5.x 1492 1520
SUN 1.5.5 (Linux) 2634 2660
НЕД 1.4.2 1564 1564
SUN 1.4.2 (Linux) 1900 1260
IBM 1.4.2 (Linux) 2047 N/A
BEA JRockit 1.5 (U3) 1909 1902
Сега JDK1.6.0_05 използвам, тествах го. Най-важното в клиентското състояние е, че моят JDK не разпознава параметъра -Server и не може да тества състоянието на сървъра. Оценките са приблизително същите.
SUN 1.6.0 1442 N/a
Изглежда, че е невъзможно да се използва голяма памет в Java. Общата поговорка е, че ако паметта е твърде голяма, времето за събиране на боклука ще бъде дълго. Това също е разбираемо, обикновено се събира, когато паметта не е достатъчна, сканирането на 2G паметта е разбира се много по-бавно от 1G, а има повече обекти памет, оценената връзка се увеличава експоненциално.
По-долу са приложени методите и тестовите записи на YuLimin.
Метод на теста:Тествайте с командата java -XmxXXXXM -version под командния ред, и след това постепенно увеличава стойността на XXXX, ако се изпълнява нормално, това означава, че посоченият размер на паметта е наличен, в противен случай ще се отпечата съобщение за грешка.
Тествайте максимално поддържаната памет на JVM и след това зададете променливите на средата на системата
Име на променливата: _JAVA_OPTIONS Стойност: - Xmx1G
|
Предишен:Използва се плъгинът jQuery fullscreen "jQuery Fullscreen plugin"Следващ:Разликата между сертификатите SSL, OV, DV и EV
|