0%

JVM-入门

JVM-入门

JVM-入门

类加载器,内存空间,垃圾收集器。

内存空间:方法区,堆,栈。

堆、栈、方法区

存放由new创建的对象和数组。堆中分配的内存,由java虚拟机自动垃圾回收器来管理。

根据垃圾回收机制的不同,Java堆有可能拥有不同的结构。最为常见的就是将整个Java堆分为
新生代和老年代。

参数调节

1
2
3
4
5
6
7
8
9
-XX:+PrintGC 每次触发GC的时候打印相关日志
-XX:+UseSerialGC 串行回收
-XX:+PrintGCDetails 更详细的GC日志

-Xms 堆初始值
-Xmx 堆最大可用值
-Xmn 新生代堆最大可用值
-XX:NewRatio 新生代与老年代的比例 例如: –XX:NewRatio=2,则新生代占整个堆空间的1/3,老年代占2/3
-XX:SurvivorRatio 用来设置新生代中 Eden 与 Survivor 的比值
1
-Xms 5m -Xmx 20m -XX:+PrintGCDetails -XX:+UseSerialGC -XX:+PrintCommandLineFlags

Java栈是一块线程私有的空间,一个栈,一般由三部分组成:局部变量表、操作数据栈和帧数据区。

方法区:

Java方法区和堆一样,方法区是一块所有线程共享的内存区域,他保存系统的类信息。
比如类的字段、方法、常量池等。

垃圾收集器

FullGC:年老代的回收

jvm调优

调优目标

  1. GC的时间足够的小
  2. GC的次数足够的少
  3. 发生Full GC的周期足够的长

年轻代和年老代不同大小的影响

  • 大年轻代小年老代:大的年轻代会延长普通GC的周期,增加每次GC的时间;小的年老代会导致更频繁的Full GC

  • 小年轻代大年老代:小的年轻代会导致普通GC很频繁,但每次的GC时间会更短;大的年老代会减少Full GC的频率

如何选择年轻代与年老代比例

  • 如果应用存在大量的临时对象,应该选择更大的年轻代;
  • 如果存在相对较多的持久对象,年老代应该适当增大。
  • Full GC尽量少的原则,让年老代尽量缓存常用对象,JVM的默认比例1:2也是这个道理
  • 观察应用一段时间,看其他在峰值时年老代会占多少内存,在不影响Full GC的前提下,根据实际情况加大年轻代,比如可以把比例控制在1:1。但应该给年老代至少预留1/3的增长空间