JVM的内存模型和垃圾回收机制


本篇内容介绍了“JVM的内存模型和垃圾回收机制”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!jvm的内存模型和heap的分代模型如上图所示分代原因:提升GC性能和方便内存分配1. 内存分配新生代与老年代的比值大概是1:3eden区和surviver区的比值默认8:12. 内存回收几乎所有的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. 垃圾收集器主要目标是获 香港云主机取最短垃圾回收停顿时间,最短的垃圾收集停顿时间可以为交互比较高的程序提高用户体验,总体上来看CMS收集器的内存回收和用户线程是一起并发地执行基于标记-整理算法,不产生内存碎片。可以非常精确控制停顿时间,在不牺牲吞吐量前提下,实现低停顿垃圾回收5. 结语 jvm的内存回收依赖垃圾收集器,而垃圾收集器是垃圾回收算法的具体实现,可以通过启动参数指定不同的新生代,老年代的垃圾回收器。所有垃圾回收器的优化方向都是尽可能的降低“stop the world”的耗时,也就是垃圾回收线程执行耗时,尽可能的提高cpu的吞吐量。不同的实现方案造成了不同的垃圾回收器。如serial,parallel,cms,没有一种能够适应所有的垃圾回收需求,都是根据义务需求组合使用,目前最牛掰的是G1回收器,但是生产环境几乎没有使用。“JVM的内存模型和垃圾回收机制”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注开发云网站,小编将为大家输出更多高质量的实用文章!

相关推荐: Thymeleaf常用语法总结

这篇文章主要介绍“Thymeleaf常用语法总结”,在日常操作中,相信很多人在Thymeleaf常用语法总结问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Thymeleaf常用语法总结”的疑惑有所帮助!接下来,请跟着小编一起来学…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 08/08 22:26
下一篇 08/08 22:26

相关推荐