为什么需要JVM调优?

Java程序编译后的文件是需要通过JVM虚拟机来进行运行的。

而JVM虚拟机中分为三个大部分,分别是类文件加载器,数据区和执行引擎。

在这之中,数据区就像是内存,而执行引擎就像是CPU。

在数据区中,有五个小分区,分别是堆、方法区(元空间)、栈、本地方法栈、程序计数器,其中前两个是线程共享数据,后三个是线程私有数据,因此只有前两个区域会出现并发问题。

在堆中,分为两个大空间,分别叫做新生代和老年代。假设现在有800M内存,它们之间是按照1:3的比例来进行分配的,那么现在新生代区就有200M,而老年代有着600M的空间。

在新生代中,也分成了三块区域,分别叫Eden、S0和S1,他们的空间分配比例为8:1:1,那么现在Eden区就有着160M,其他区域各占20M的空间。

现在拟定一个程序,向堆中不断得存入新的对象。

在堆中的储存过程如下:对象先进入Eden区,当随着程序的运行,Eden区中的内存空间即将被占满的时候,就会触发minor gc垃圾回收机制,该机制将判断Eden区中储存的所有对象,如果某一对象没有任何与之有关的引用,那么它将被删除,而那些存在引用关系的对象则将被存入S0区,而在触发回收机制前S0区中存在的对象也会往后存入S1区,一但对象从Eden区进入S0区,该对象的分代年龄就会从0变成1,而每进行一次minor gc回收,新生代区中的对象的分代年龄都会+1,当某个对象的分代年龄达到15的时候,这个对象就会被存入老年代区,还有一种对象会直接从Eden区进入老年代区的情况,就是该对象的大小超过S0区域的一半,那么当它在Eden区中第一次遇到垃圾回收并保留下来时,就会直接进入老年代。随着该程序的运行,老年代区的空间也会逐渐趋近满载,这时就会触发一个可怕的事情,full gc回收机制,它将对新生代和老年代同时进行垃圾处理,而这时,程序请求向堆中存储对象就无法实现,这就是STW现象,程序停顿。如果在数千万订单访问的程序中,程序停顿一秒钟,就会造成不可想象的损失,因此JVM调优显得格外重要。

  • 7
    点赞
  • 6
    评论
  • 17
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值