JVM-入门
JVM-入门
类加载器,内存空间,垃圾收集器。
内存空间:方法区,堆,栈。
堆、栈、方法区
堆
存放由new创建的对象和数组。堆中分配的内存,由java虚拟机自动垃圾回收器来管理。
根据垃圾回收机制的不同,Java堆有可能拥有不同的结构。最为常见的就是将整个Java堆分为
新生代和老年代。
参数调节
1 | -XX:+PrintGC 每次触发GC的时候打印相关日志 |
1 | -Xms 5m -Xmx 20m -XX:+PrintGCDetails -XX:+UseSerialGC -XX:+PrintCommandLineFlags |
栈
Java栈是一块线程私有的空间,一个栈,一般由三部分组成:局部变量表、操作数据栈和帧数据区。
方法区:
Java方法区和堆一样,方法区是一块所有线程共享的内存区域,他保存系统的类信息。
比如类的字段、方法、常量池等。
垃圾收集器
FullGC:年老代的回收
jvm调优
调优目标
- GC的时间足够的小
- GC的次数足够的少
- 发生Full GC的周期足够的长
年轻代和年老代不同大小的影响
大年轻代小年老代:大的年轻代会延长普通GC的周期,增加每次GC的时间;小的年老代会导致更频繁的Full GC
小年轻代大年老代:小的年轻代会导致普通GC很频繁,但每次的GC时间会更短;大的年老代会减少Full GC的频率
如何选择年轻代与年老代比例
- 如果应用存在大量的临时对象,应该选择更大的年轻代;
- 如果存在相对较多的持久对象,年老代应该适当增大。
- Full GC尽量少的原则,让年老代尽量缓存常用对象,JVM的默认比例1:2也是这个道理
- 观察应用一段时间,看其他在峰值时年老代会占多少内存,在不影响Full GC的前提下,根据实际情况加大年轻代,比如可以把比例控制在1:1。但应该给年老代至少预留1/3的增长空间