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