爬梯:JVM剖析理解

JVM剖析理解

1、JVM虚拟机内存模型结构图

在这里插入图片描述

模型解释:

紫色部分: 栈(线程)、本地方法栈、程序计数器。

  • 栈:就是我们常说的内存栈,用户储存线程运行中中产生的临时普通变量;
  • 本地方法栈:java是95年发布的高级语言,但在之前已经有的C语言在底层中担任着不可取代的作用。
    例如使用Thread.start(),start()方法则是“本地方法”,方法签名有native关键字修饰会去执行**.dll中的C语言函数。
  • 程序计数器:当线程不只有一条时,由于CPU分片或手动挂起线程等原因会将线程挂起再执行,那么这里有个计数器记录JVM源码中的“代码行号”,在再次执行时根据这个行号继续执行线程任务;

黄色部分 :堆、方法区(元空间)。

  • 堆:用户存放对象;
  • 方法区:用户存储常量、静态变量、类信息。jdk8改名元空间。PS:此处存放的常量和静态变量都是在方法外部的,不属于线程栈中的变量。

堆内部可以拆分为两大块:年轻代和老年代;

年轻代:Eden和Survivor
老年代:Old
Survivor有两个区:S1 、 S2,在GC回收时切换GC ROOTS对象存储

内存分配比 Eden : Survivor : Old = 1/3* 4/5 : 1/3* 1/10 : 1/3* 1/10 : 2/3 = 8/30 : 1/30 : 1/30 : 20/30
堆结构图

线程栈
线程栈结构图

  • 程序计数器:代码编译为jvm代码后在方法内部的代码“行号”,用于记录当前代码执行到第几行;当cpu指针切换到别的线程再切换回来时,从计数器的位置继续执行代码;
  • 线程栈(FILO):栈结构,一个线程一个线程栈;
  • 栈帧:每个函数有一个栈帧;
  • 局部变量表:方法内部声明的变量;
  • 操作数栈:方法内部临时创建的变量例如:a=1,其中的1属于基本数据类型,直接存在操作数栈中,后被赋值给局部变量则出栈;
  • 动态链接:
  • 方法出口:记录方法执行完之后返回的位置;

2、JVM垃圾收集机制

堆结构图

垃圾回收机制

  1. 代码中new出来的对象,存储在Eden区,这时给这个对象加上对象分代年龄设置为0,如:Student【0】。
  2. 经过一段时间Eden区快满之后(可以自己设置条件),由 minor gc 对其进行回收。将“GC Roots ”对象作为起点,从这些节点开始向下搜索引用的对象,找到的对象都标记为非垃圾对象。然后minor gc将标记为非垃圾的对象复制到Survivor区的S1区,并为其分代年龄+1如:Student【1】,之后直接对Eden区内的对象全部删除。
  3. 经过一段时间之后,当Eden区又满了的时候,则会对Eden区和存放了对象的Survivor区进行回收。根据GC Roots链条将非垃圾对象移动到Survivor中没有对象的区域,并且对象分代年龄+1,然后对Eden区和另一个Survivor区进行清空处理。
  4. 当对象分代年龄达到15层、出现超大内存对象或对象内存超过S0区的50%时,对象会被直接移入老年代,不再有minor gc扫描。
  5. 一般几周或者几个月之后老年代的对象全满之后,由full gc对老年代根据GC Roots区分垃圾对象进行清除。
  6. 若full gc也清理不完老年代的对象时,老年代又满了的情况,新的内存放进来会触发OOM:Out Of Memery 错误。

GC Roots根节点:线程栈的本地变量、静态变量、本地方法栈的变量等等。
对象分代年龄:存储在对象头中。

对象结构模型

在这里插入图片描述

3、常见JVM诊断工具调优

PS:JVM的垃圾回收机制GC,属于系统线程,在每次执行资源回收之前,都会先执行STW:“stop the world”方法暂停全部用户线程。

Java VisualVM

这是jvm自带的缓存视图化工具,可以查看:

  • JVM参数、系统属性
  • 进程的CPU、类、堆、元空间使用情况
  • Visual GC 查看堆的整个内存使用情况(需要安装插件)

4、JVM调优浅谈

调优方法1:评估核心系统的处理流程的对象的内存模型,判断出“朝生夕舍”的对象,调节堆内存大小处理。

阿里面试题:能否对JVM进行调优,让其几乎不发生Full GC?
场景:假设整个订单对象为60兆,当订单对象从eden区出来进入S0区时,因为超过S0区内存的50%会直接进入老年代。
优化:将老年代的内存大小设置为1G,而eden区为1.6G,S0=200m,S1=200m,此时,订单对象将不会进入老年代。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq845484236/article/details/107792062
今日推荐