一、JVM Heap分爲三部分:新生代、老年代、永久代;
新生代:用於存放JVM新分配的java對象;
老年代:新生代中經過垃圾回收沒有回收掉的對象將被copy到老年代;
永久代:存放Class、Method元信息,也就是反射對象,一般設置爲128M足夠,設置原則是預留30%空間。
二、GC的引發:
1、新生代擁有2個線程;
(1)當新生代的Eden代滿了引發普通GC,僅僅回收新生代;
(2)新生代空間不足時,會把存活的對象轉移到老生代。
2、老年代:當老年代滿時引發Full GC,它將會同時回收新生代、老年代。
3、永生代:當永生代滿時引發Full GC, 它將會把Class 、Method元信息卸載。
三、何原因導致OutOfMemoryException
1、JVM98%代時間都在內存回收;
2、每次回收的內存小於2%。
滿足這兩個原因纔會處發。
四、性能優化
希望達成的目標:
1、GC的時間足夠的小;
2、GC的次數足夠的少;
3、發生Full GC的週期足夠的長。
需要做的事情:
1、建少使用全局變量和大對象;
2、調整新生代的大小到最合適;
3、設置老年代的大小爲最合適;
4、選擇合適的GC收集器。
優化方面:
1、線程池:解決用戶響應時間長的問題;
2、鏈接池;
3、JVM啓動參數:調整各代的內存比例和垃圾回收算法,提供吞吐量;
4、程序算法:改進程序邏輯算法提高性能。
五、JVM監控
java自帶的監控工具比較多,下面僅使用了2種:
1、jstat -gcutil [java PID] 1000(間隔毫秒數) 5(打印的條數);例子:jstat -gcutil 25 1000 5
2、jmap -heap 25