新生代、老年代、永久代的概念很少說,這三個空間中任何一個不能知足內存分配請求時,就會發生垃圾收集。html
新生代不知足內存分配請求時,發生Minor GC,老年代、永久代不知足內存分配請求時,發生Full GC,Minor GC比Full GC持續的時間要短不少。java
因此內存空間設置的不合理就會頻繁引發垃圾收集,以及OutOfMemoryError錯誤,嚴重影響程序性能。算法
若你的應用部署在單獨的服務器,且該服務器上只有這一個應用,那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
這個計算法則,只是起到指導性的意見,實際操做中,仍是須要根據實際狀況來應變。
在調整後面兩項「延遲、吞吐量」時,這些堆的大小還須要進一步的調整。