当前位置:首页 > Java技术 > JVM调优原理和垃圾回收机制

JVM调优原理和垃圾回收机制

2022年09月17日 10:36:23Java技术4

前言

对JVM有了一定的认识以后,我们自然而然的就会知道两个异常,一个叫栈溢出(StackOverFlowError),一个叫堆溢出(OutOfMemory)或者说是内存泄漏;在Java内存模型中,栈是每一个线程私有的,随着线程的创建而创建,当栈的内存不足时,就会导致栈溢出的情况;而堆溢出则是指JVM在无法为对象申请到足够的内存空间时而抛出的异常;当我们的程序中出现这两个问题时,此时我们就需要对JVM进行一个调优处理。

调优的核心参数

在Java8以后,内存模型中的永久代已经被移除,取而代之的是元空间;永久代和元空间最大的不同在于前者使用的是JVM的堆内存,但是后者却已经不在JVM中了,它使用的是物理内存,因此在Java8以后,关于JVM的调优我们只需要关注堆中的新生区和养老区,如下图所示

JVM调优原理和垃圾回收机制 _ JavaClub全栈架构师技术笔记

常见配置汇总

JVM调优原理和垃圾回收机制 _ JavaClub全栈架构师技术笔记

 垃圾回收机制

当类加载器把新的对象放到堆中时会触发JVM的GC,但JVM在进行GC时,并非每次都对堆内存中的三个区域一起回收的,大部分时候的回收其实都只是针对新生代,因此GC按照回收区域划分可以分为两种,一种是普通GC(Minor GC),一种是全局GC(Full GC);普通GC只针对新生代区域进行垃圾收集操作,因为大多数的Java对象存活率不高,因此普通GC非常频繁,速度也较快;全局GC只针对老年代进行垃圾收集操作,因为老年区的内存空间较大,所以全局GC相对于普通GC的频率较低,速度慢10以上,且全局GC一旦触发,也就意味着系统要考虑内存优化的问题了;JVM垃圾回收机制大致如下图所示

JVM调优原理和垃圾回收机制 _ JavaClub全栈架构师技术笔记

四种垃圾回收算法简介

引用计数法

JVM调优原理和垃圾回收机制 _ JavaClub全栈架构师技术笔记

 

复制算法

应用在年轻代中的GC算法,该算法的基本思想就是将内存分成两块,每次只用其中一块,当这一块内存用完,就会进行GC,未被回收的对象则复制到另一块区域,依次类推,大致原理如下

JVM调优原理和垃圾回收机制 _ JavaClub全栈架构师技术笔记

标记清除法

用通俗的话来说,标记清除算法就是程序运行期间,当内存快要被耗尽时,GC就会被触发并将程序暂停,随后将要回收的对象标记一遍,最终统一回收这些对象,完成标记清理共作然后让程序恢复运行

JVM调优原理和垃圾回收机制 _ JavaClub全栈架构师技术笔记

标记压缩法

该算法与上标记清除法唯一的区别就是在它的基础上增加了一个压缩的操作,这样就能解决内存碎片的问题,但是却带来来效率不高的问题,其原理大致如下图所示:

JVM调优原理和垃圾回收机制 _ JavaClub全栈架构师技术笔记

总结

对于上述四种算法,单从效率上来说,复制算法无疑是最快的,但是却浪费来较多的内存,标记清除和标记整理方法虽然兼顾了内存碎片这一个问题,但其效率较慢,所以我们无法从绝对意义上说这四种算法谁优谁劣。只是在实际应用中,我们发现复制算法在新生区效果更好一些,而标记清除或者标记整理在养老区则更强劲,因此我们把JVM的垃圾回收称作分代收集算法。

 

作者:每天都要进步哇
来源链接:https://blog.csdn.net/weixin_40655220/article/details/105905133

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/42473.html

标签: JVM调优
分享给朋友:

“JVM调优原理和垃圾回收机制” 的相关文章

性能优化|一张图带你了解JVM是如何进行内存分配

性能优化|一张图带你了解JVM是如何进行内存分配

对象优先在新生代分配 如果对象能够在eden区分配,那么就直接在eden区分配 如果eden区域大小不够新对象存储的话,则会触发一次minor gc, 如果minor gc后发现对象也无法在s区分配,则会直接在老年代中分配...

IDEA启动失败,报Failed to create JVM错误的解决办法

IDEA启动失败,报Failed to create JVM错误的解决办法

IDEA启动失败,报Failed to create JVM错误的解决办法 从网上下载的破解版IDEA,照网上的pojie方法进行破解时,很多人是用Windows自带的记事本添加并保存的。但是用记事本保存的文件是带有BOM的,从而导致启动IDEA报...

Java String(JVM角度)

Java String(JVM角度)

基本特性 存储结构变更 jdk8及之前的jdk版本中,String的内存存储结构是char[]字符数组,但是在Jdk9及之后改成了byte[]字节数组。 原因是,堆空间中大部分的字符串内容都是latin字符,基本上...

JVM 从入门到精通(二)JVM和Java体系结构

JVM 从入门到精通(二)JVM和Java体系结构

写在前面:我是「云祁」,一枚热爱技术、会写诗的大数据开发猿。昵称来源于王安石诗中一句 [ 云之祁祁,或雨于渊 ] ,甚是喜欢。 写博客一方面是对自己学习的一点点总结及记录,另一方面则是希望能够帮助更多对大数据感兴趣的朋友。如果你也对 数据中台...

深入理解JVM(1)——JVM内存模型

Java虚拟机的内存空间分为五个部分,分别是: 程序计数器; Java虚拟机栈 本地方法栈 堆 方法区 接下来对这五部分分别进行详细的介绍 1、程序计数器:   a)什么是程序计数器:程序计数器是内存中的一个很小...

JVM——JVM大厂面试问题与解答

JVM——JVM大厂面试问题与解答

摘要 本博文主要分享在JVM中的大厂面试问题。总结相关面试问题与yu解答。帮助大家更好的学习与理解JVM的原理。同时也是分享一些有关于JVM实战的经验,帮助大家在工作中排查错误。 一、JVM的内存模型 1.1 JVM1.8内存模型 1.2 JVM内存模型中...

【Java】JVM内存模型解析

【Java】JVM内存模型解析

   JVM内存模型主要分为五大区域:栈、堆、本地方法栈、程序计数器、方法区。   本地方法栈: 跟虚拟机栈非常相似,也是线程私有的,不过虚拟机栈是针对Java方法,而本地方法栈是针对native方法,也就是底层方...

JVM 算法简介

JVM 算法简介

JVM学习目录 1.JVM 概念简介 2.JVM 运行时内存 3.JVM算法简介 4.JVM 垃圾收集器 5.JVM 调优实战 通过以上的文章我们对JVM有了初步的认识,在前几篇文章中也说过一些算法知识点,今天这篇文章我们进行算法的分享 一、...

java jvm设置

2. 如何分配JVM内存设置: (1)当在命令提示符下启动并使用JVM时(只对当前运行的类Test生效):     java -Xmx128m -Xms64m -Xmn32m -Xss16m Test     (2)当在集...

jvm中关于slot的理解

jvm中关于slot的理解

jvm中关于slot的理解 参数值的存放总是在局部变量数组的index0开始,到数组长度-1的索引结束。 局部变量表,最基本的存储单元是slot(变量槽) 局部变量表中存放编译期可知的各种基本数据类型(8种),引...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。