首页  

jvm相关知识点     所属分类 jvm 浏览量 576
JVM内存结构 
什么时候对象可以被收回
常见的垃圾回收器算法有哪些,各有什么优劣
什么时候对象会进入老年代
什么是空间分配担保策略
如何优化减少Full GC

JVM内存结构 
线程私有区域和共享区域
虚拟机栈/本地方法栈负责存放线程执行方法栈帧
程序计数器用于记录线程执行指令的位置
方法区(元数据区)存储类的元数据信息、静态变量、常量等数据
堆(heap)使用new关键字创建的对象都会进入堆中,堆被划分为新生代和老年代


判断对象是否可回收
引用记数   
GC Roots

引用计数无法解决循环引用问题
GC Roots通过一系列的GC Roots对象作为起始点,从这些节点开始向下搜索,搜索过的路径称为引用链,
当一个对象到GC Roots没有任何引用链相连时,对象不可达,可被回收。

GC Roots 对象包括下面几种
虚拟机栈中引用的对象 
方法区中类静态属性引用的对象
方法区中的常量引用的对象 
本地方法栈中JNI(Native方法)引用的对象


GC算法

标记清除速度快,但是会产生内存碎片;
标记整理解决了标记清除内存碎片的问题,但是每次都得移动对象,因此成本很高;
复制算法没有内存碎片也不需要移动对象,但是导致空间浪费;


对象何时进入老年代

根据对象年龄
对象每“熬过”一次GC,年龄+1 ,
对象年龄到达设置的阈值(默认为15岁)会被移动到老年代,-XX:MaxTenuringThreshold

动态年龄判断
一批对象的总大小大于 Survivor内存的50% ,那么大于这批对象年龄的对象,直接进入老年代。

大对象直接进入老年代
-XX:PretenureSizeThreshold 

空间分配担保策略
执行Minor GC之前,检查老年代最大可用的连续空间是否大于新生代所有对象的大小,
如果大于则此次Minor GC是安全的 , 直接执行 Minor GC , 
如果小于,则会检查 HandlePromotionFailure设置 。
如果为true,会继续检查老年代最大可用连续空间是否大于历次晋升到老年代的对象的平均大小,
如果大于则尝试进行一次Minor GC,但这次Minor GC依然是有风险的;
如果小于或者HandlePromotionFailure 为 false,则改为进行一次Full GC。
 



如何优化减少Full GC

估算系统每秒占用内存数量
估算Minor GC执行频率
检查Survivor 空间是否足够
大对象检查 , 如果存在短命大对象 注意 PretenureSizeThreshold 设置
合理设置对象年龄阈值 ,让本应该进入老年代的对象,尽快的进入老年代,避免复制成和浪费新生代空间,
Survivor空间不足,可能引发Full GC。


System.gc()  可通过 -XX:+ DisableExplicitGC 来禁止
老年代空间不足
永生区或元数据区空间不足
CMS GC时出现promotion failed和concurrent mode failure ,这两种情况会触发  Full GC

promotion failed 是在 Minor GC时,survivor space放不下、对象只能放入老年代,而此时老年代空间不足

concurrent mode failure是在执行CMS GC的过程中同时有对象要放入老年代,而此时老年代空间不足

增大survivor space、老年代空间或 调低触发并发GC的比率 


-XX:CMSInitiatingOccupancyFraction
value=75 表示 第一次CMS垃圾收集会在老年代占用75%时被触发
默认值为68

 各种垃圾收集器的特点及使用场景 
 Java GC种类及配置说明   

 CMS JVM参数介绍 
 java8 jvm 参数 
 java8的方法区  
 metaspace OOM 实例  
 JVM CMS 常用参数 

 G1垃圾收集器jvm参数  
 G1的两种GC模式  
 java GC之 CMS 和 G1   
 g1 GC 要点  

上一篇     下一篇
properties与yml配置文件比较

分布式限流方案

lua函数使用说明

ConcurrentHashMap读操作为什么不需要加锁

java里的协程

一致性算法raft要点