本篇内容介绍了“JVM的内存模型和垃圾回收机制”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
创新互联公司专注于企业营销型网站建设、网站重做改版、纳溪网站定制设计、自适应品牌网站建设、HTML5、商城网站建设、集团公司官网建设、外贸营销网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为纳溪等各大城市提供网站开发制作服务。
jvm的内存模型和heap的分代模型如上图所示
名称 | 是否线程共享 | 存放内容 |
虚拟机栈 | 否 | 局部变量表、方法出口等 |
本地方法栈 | 否 | native方法 |
程序计数器 | 否 | 当前线程支持的字节码命令 |
方法区 | 是 | jvm加载的类信息、常量、静态变量等 |
堆 | 是 | 创建的java对象 |
分代原因:提升GC性能和方便内存分配
1. 内存分配
新生代与老年代的比值大概是1:3
eden区和surviver区的比值默认8:1
2. 内存回收
几乎所有的java对象都是在eden区出生的,当eden区没有足够的空间时虚拟机会发起一次minorGC,此后存活下的对象会被放到seurvier区,如果surviver区的空间不够,则根据内存担保原则分配到老年代。
垃圾确认原则:应用技术法与可达性分析法
引用计数法:即一个对象如果没有任何与之关联的引用,即他们的引用计数都不为0,则说明对象不太可能再被用到,那么这个对象就是可回收对象(可是会有循环引用的问题)。
可达性分析法:解决引用计数法的循环引用问题,如果在“GC roots”和一个对象之间没有可达路径,则称该对象是不可达的。要注意的是,不可达对象不等价于可回收对象,不可达对象变为可回收对象至少要经过两次标记过程。两次标记后仍然是可回收对象,则将面临回收。
miborGC(复制-》清空-》互换)流程:eden、servicorFrom 中存活对象复制到ServicorTo,年龄+1,15代之后进入老年代,大对象直接进入老年代;-》清空eden、servicorFrom;-》 ServicorTo和ServicorFrom互换。
垃圾回收内存担保原则:老年代中的连续可用内存空间大于新生代对象总大小或者历次晋升到老年代对象平均大小就执行minorGC,否则就fullGC.
3. 垃圾回收算法
新生代采用标记-复制算法回收内存,理论上需要一半的内存来复制对象(不易产生内存碎片,但是可用内存会被压缩一半),但是95%的对象都是朝生夕死,所以将新生代中的复制区域划分为8:1,也就是可以使用整个新生代内存的90%,而不是一半。
老年代采用的是标记-清除算法来回收内存,会产生不连续的内存碎片。
永久代(或者方法区)也可以回收,就是回收条件比较苛刻
java堆中不存在该类实例
该类的classLoader都被回收
该类的java.long.Class都被回收,无法通过反射访问改方法,满足以上三条件,方法区内的类就被回收了。
4. 垃圾收集器
名称 | 使用范围 | 原理 | 优缺点 |
---|---|---|---|
Serial | 新生代 | 单线程,复制算法 | 简单高效,java虚拟机client模式下默认新生代垃圾收集器 |
ParNew | 新生代 | Serial+多线程 | ParNew收集器默认开启和CPU数目相同的线程数,java虚拟机运行在Server模式下新生代的默认垃圾收集器,ParNew垃圾收集器在垃圾收集过程中同样也要暂停所有其他的工作线程 |
Parallel Scavenge | 新生代 | 多线程复制算法 | 重点关注的是程序达到一个可控制的吞吐量 |
Serial Old(MSC) | 老年代 | 单线程标记整理算法 | Client默认的java虚拟机默认的年老代垃圾收集器,也会暂停所有线程 |
Parallel Old | 老年代 | 多线程标记整理算法 | Parallel Old正是为了在年老代同样提供吞吐量优先的垃圾收集器,如果系统对吞吐量要求比较高,可以优先考虑新生代Parallel Scavenge和年老代Parallel Old收集器的搭配策略 |
CMS | 老年代 | 多线程标记清除算法 | 主要目标是获取最短垃圾回收停顿时间, 最短的垃圾收集停顿时间可以为交互比较高的程序提高用户体验,总体上来看CMS收集器的内存回收和用户线程是一起并发地执行 |
G1 | 新生代/老年代 |
| G1收集器避免全区域垃圾收集,它把堆内存划分为大小固定的几个独立区域,并且跟踪这些区域的垃圾收集进度,同时在后台维护一个优先级列表,每次根据所允许的收集时间,优先回收垃圾最多的区域。区域划分和优先级区域回收机制,确保G1收集器可以在有限时间获得最高的垃圾收集效。 |
5. 结语
jvm的内存回收依赖垃圾收集器,而垃圾收集器是垃圾回收算法的具体实现,可以通过启动参数指定不同的新生代,老年代的垃圾回收器。所有垃圾回收器的优化方向都是尽可能的降低“stop the world”的耗时,也就是垃圾回收线程执行耗时,尽可能的提高cpu的吞吐量。不同的实现方案造成了不同的垃圾回收器。如serial,parallel,cms,没有一种能够适应所有的垃圾回收需求,都是根据义务需求组合使用,目前最牛掰的是G1回收器,但是生产环境几乎没有使用。
“JVM的内存模型和垃圾回收机制”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!
售后响应及时
7×24小时客服热线数据备份
更安全、更高效、更稳定价格公道精准
项目经理精准报价不弄虚作假合作无风险
重合同讲信誉,无效全额退款