Java性能優化權威指南-讀書筆記(三)-JVM性能調優-內存佔用

新生代、老年代、永久代的概念很少說,這三個空間中任何一個不能知足內存分配請求時,就會發生垃圾收集。html

新生代不知足內存分配請求時,發生Minor GC,老年代、永久代不知足內存分配請求時,發生Full GC,Minor GC比Full GC持續的時間要短不少。java

因此內存空間設置的不合理就會頻繁引發垃圾收集,以及OutOfMemoryError錯誤,嚴重影響程序性能。算法

Java堆大小計算法則

若你的應用部署在單獨的服務器,且該服務器上只有這一個應用,那Java堆確定是越大越好,但這種狀況比較少。服務器

Java堆大小能夠參考下面這個表格:性能

空間 命令行選項 佔用倍數
Java堆 -Xms:最小堆大小
-Xmx:最大堆大小
3~4倍Full GC後老年代空間佔用
永久代 -XX:PermSize
-XX:MaxPerSize
1.2~1.5倍Full GC後永久代空間佔用
新生代 -Xmn 1~1.5倍Full GC後老年代空間佔用
老年代 Java堆大小 - 新生代大小 2~3倍Full GC後老年代空間佔用

其中這些空間佔用,都是指應用程序在穩定狀態(指應用運行了一段時間)下,Full GC後Java堆佔用的空間大小,即活躍數據的大小。ui

參照下面這個GC日誌:spa

12.251: 
[Full GC
[PSYoungGen: 15945K->0K(278528K)] 
[ParOldGen: 30724K->29331K(67072K)] 46670K->29331K(345600K), 
[PSPermGen: 34785K->34774K(1081344K)], 0.1022337 secs] 
[Times: user=0.20 sys=0.00, real=0.10 secs]

1). Java堆大小:29331K(約30M) * (3~4),即90M~120M命令行

2). 永久代大小:34774K(約34M)* (1.2~1.5),即41M~51M日誌

3). 新生代大小:29331K(約30M) * (1~1.5),即30M~45Mcode

4). 老年代大小:(90M~120M) – (30M~45M),即60M~75M

這個計算法則,只是起到指導性的意見,實際操做中,仍是須要根據實際狀況來應變。

在調整後面兩項「延遲、吞吐量」時,這些堆的大小還須要進一步的調整。

相關文章
相關標籤/搜索