1.內存分配參數---大綱
- Ø如何設置堆內存
- Ø如何設置棧內存
- Ø如何設置方法區
- Ø如何設置對的分配比率
- Ø設置參數打印堆棧;
- ØJava程序的兩種模式:Server&Client
2.設置堆內存
Ø設置最大堆內存
Ø參數:-Xmx10M,表示堆內存最大為10M,如果超過10M則會出現內存溢出的異常。
Ø查看方法: maxMemory()
Ø設置最小堆內存
Ø參數:-Xms2M,系統初始化的時候就會分配2M內存給java程序。
Ø設置新生代內存
Ø參數1:-Xmn5M,表示堆內存中新生代內存大小為5M,如果超過則會向老年代申請空間。
Ø參數2:-XX:NewSize(最小的新生代大小)-XX:MaxNewSize(最大的新生代大小)
Ø-Xmn5M==-XX:NewSize5M –XX:MaxNewSize5M
Ø參數2不建議使用,會引起內存震盪。
3、方法區內存
Ø之前說過,對於使用了CGLib,Javassist,ASM等動態生成大量class類的框架尤其需要注意該內存的設置。
Ø最小設置
Ø參數:-XX:PermSize=4M;
Ø解釋:表示方法區最小的內存為4M,JVM初始化的時候就會分配至少4M的方法區內存。
Ø最大設置
Ø參數:-XX:MaxPermSize=10M
Ø解釋:表示方法區最大的內存為10M,當動態擴展超過10M的時候就會出現內存溢出。
4、棧內存
Ø棧內存貌似沒有設置最大最小的參數,根據我的理解配置的參數是最大的,也就是說最大不能超過,如果沒有線程則不會分配,這樣應該是合理的,他的生命周期和線程一樣。
Ø配置參數:-Xss10M
Ø解釋:表示為沒一個線程分配10M的空間
Ø注意事項:
Ø如果一個線程的內存使用超過了-Xss的設置則會拋出異常
Ø如果給棧內存設置較大,則同時開啟的線程數必然減少。
Ø棧內存的大小還會影響到堆內存的大小;
5、分配比率
Ø堆的分配比率:
Ø新生代:占據整個堆的1/4~1/3為最佳
Ø新生代和s區的分配:最好設置為8:1為最佳
Ø配置參數:-XX:SurvivorRatio=8
Ø新生代和老年代的分配:最好設置為2:1為最佳
Ø配置參數:-XX:NewRatio=2
6、參數總結
配置 |
說明 |
-Xms |
設置堆內存的最小值 |
-Xmx |
設置堆內存的最大值 |
-Xss |
設置棧內存的大小 |
-XX:MinHeapFreeRatio |
設置堆內存的最小空閑比例 |
-XX:MaxHeapFreeRatio |
這是堆內存的最大空閑比例 |
-XX:NewSize |
設置新生代的最小內存值 |
-XX:NewMaxSize |
設置新生代的最大內存值 |
-XX:SurviorRatio |
設置Eden區和Survior區的比例 |
-XX:MaxPermSize |
設置持久代的最大值 |
-XX:PermSize |
設置持久代的最小值 |
-XX:TargetSurvivorRatio |
設置survivor區的可使用率 |
7、打印GC信息
Ø不論是在進行MinorGC還是FullGC,使用該參數都可以當前的內存使用情況;
Ø參數如下:
Ø-XX:+PrintGCDetails
Ø-verbose:gc
Ø上面兩個都可以,第一個較為詳細!
8、Java運行模式
ØJava不會顯式的制定運行的模式,JVM會根據內存的大小自動進行判斷,主要有Server和Client兩種模式。
ØServer模式
Ø啟動速度慢
Ø運行速度快
ØJVM在Server模式默認-Xms是128M,-Xmx是1024M
ØClient模式
Ø啟動速度快
Ø運行速度沒有Server模式快
ØJVM在client模式默認-Xms是1M,-Xmx是64M