常用JVM配置参数
trace跟踪参数
-verbose:gc 打印GC的简要信息
-XX:+printGC 打印GC的简要信息
-XX:+printGCDetails 打印GC的详细信息
-XX:+printGCTimeStamps 打印GC发生的时间戳
-Xloggc:log/gc.log 制定GC log的位置,以文件输出
-XX:+TraceClassLoading 监控类的加载
-XX:+PrintClassHistogram 按下Ctrl+Break,打印类的信息
堆的分配参数
-Xmx -Xms 指定最大堆,最小堆大小
-Xmn 设置新生代大小
-XX:NewRatio 新生代和老年代的比值,值为老年代/新生代
-XX:SurvivorRatio eden和1个survivor的比值,值为eden/survivor
-XX:HeapDumpOnOutOfMemoryError OOM时导出堆到文件
-XX:+HeapDumpPath 导出OOM的路径
-XX:OnOutOfMemory 在OOM时,执行一个脚本
推荐新生代占堆的3/8,survivor占新生代的1/10
OOM时,记得dump出堆,确保可以排除现场问题
永久区分配参数
-XX:PermSize -XX:MaxPermSize
设置永久区的初始空间和最大空间
栈大小分配
-Xss
通常只有几百K
决定了函数调用的深度
每个线程由独立的栈空间
局部变量,参数分配在栈上面
GC算法和种类
GC算法
- 引用计数法(无法解决循环问题,淘汰)
- 可达性分析::通过一系列称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索走过的路径称为“引用链”,当一个对象到 GC Roots 没有任何的引用链相连时(从 GC Roots 到这个对象不可达)时,证明此对象不可用
- 标记-清除:标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段。一种可行的实现是,在标记阶段,首先通过根节点,标记所有从根节点开始的可达对象。因此,未被标记的对象就是未被引用的垃圾对象。然后,在清除阶段,清除所有未被标记的对象。
- 标记-压缩:从根节点开始,对所有可达对象做一次标记后,将所有的存活对象压缩到内存的一端。之后,清理边界外所有的空间。(适合用于存活对象较多的场合)
- 复制算法:将原有的内存空间分为两块,每次只使用其中一块,在垃圾回收时,将正在使用的内存中的存活对象复制到未使用的内存块中,之后,清除正在使用的内存块中的所有对象,交换两个内存的角色,完成垃圾回收(不适用于存活对象较多的场合 如老年代)
分代思想
- 根据对象的存活周期进行分类,短命对象归为新生代,长命对象归为老年代
- 根据不同代的特点,选取合适的收集算法
1、少量对象存活,适合复制算法
2、大量对象存活,适合标记清理或标记压缩