Jobber nylig med et program for Java. Opprinnelig har jeg alltid likt Javas minnehåndtering, du trenger ikke bekymre deg for å allokere minne, bare alloker, søppelsamleren vil ta tilbake minnet for deg. Nå er programmet utviklet med store mengder data, og for å spare hastighet skal jeg laste all informasjonen inn i minnet, noe som vil sikre rask respons. Jeg teller fortsatt minnet gjentatte ganger, og tenker på min egen datamengde, som burde være nok i starten (maskinen min har 4G-minne, selv om Windows gjenkjenner 3,5G, men det bør være fint sammenlignet med mitt nåværende datavolum).
Uventet gikk programmet til det første eksperimentet i noen timer og opplevde et unntak for ute av hukommelse. Når jeg ser på mine egne VM-innstillinger, satte jeg -Xms512M -Xmx1024M. Uten å tenke over det, endret jeg det direkte til -Xms512M -Xmx2048M, og resultatet var at jeg ikke kunne reservere nok plass til objektheap. Programmet klarer ikke å reise seg. Først da innså jeg at det fortsatt var en grense for det opprinnelige maksimale minnet. Jeg søkte på Internett og fant mange artikler som diskuterte dette temaet. Til slutt fant jeg den mest nyttige artikkelen på BEAs DEV2DEV-forum
Her gjennomførte moderator YuLimin testen og kom til konklusjonen:
Selskapets JVM-versjon Maksimal minne (mega) klient Maksimal minne (mega) server
SØN 1.5.x 1492 1520
SUN 1.5.5(Linux) 2634 2660
SØN 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
Jeg bruker JDK1.6.0_05 nå, testet det. Det største problemet i klienttilstanden er at JDK-en min ikke gjenkjenner -Server-parameteren og kan ikke teste serverens tilstand. Estimatene er omtrent de samme.
SØN 1.6.0 1442 N/a
Det virker som det er umulig å bruke stort minne i Java. Og det generelle ordtaket er at hvis minnet er for stort, vil søppelinnsamlingstiden bli lang. Dette er også forståelig, vanligvis samlet inn når minnet ikke er nok, skanning av 2G-minne er selvfølgelig mye tregere enn 1G, og det finnes flere minneobjekter, den estimerte sammenhengen øker eksponentielt.
Vedlagt nedenfor er YuLimins testmetoder og testprotokoller.
Testmetode: Bruk kommandoen java -XmxXXXXM -version for å teste på kommandolinjen, og øk deretter gradvis verdien av XXXX; hvis det kjører normalt, betyr det at den angitte minnestørrelsen er tilgjengelig, ellers vil en feilmelding bli skrevet ut. |