JVM篇详细分析

JVM总体图

JVM总体图在这里插入图片描述

程序计数器
线程私有的,每个线程一份,内部保存字节码的行号,用于记录正在执行字节码指令的地址。(可通过javap -v XX.class命令查看)
java堆
线程共享的区域,用来保存对象的实例,数组等。堆区域内存不够的场景下会爆出OOM异常。java8中堆里面分为年轻代和老年代,其中年轻代又分为Eden,S0,S1。老年代一般保存声明周期比较长的对象,年轻代中经过多次垃圾回收的survivor会进入老年代。
虚拟机栈
每个线程运行时所需要的内存就是虚拟机栈,特性为先进后出,每个栈由多个栈针组成,每个栈针对应其方法调用所需要的内存(参数,返回地址等)。每个线程中只能有一个活动栈针,对应当前正在执行的方法。 垃圾回收不涉及栈内存,垃圾回收只是堆内存,当栈针弹出后,内存就被自动释放了。一个栈默认内存为1024K。一般递归调用不恰当的话会爆出java.lang.StackOverflowError问题。
方法区/元空间
方法区是各个线程共享的内存区域,其主要存储类的信息和运行时常量池(可通过javap -v查看,主要是一张表,虚拟机根据这张常量表找到要执行的类名、方法名、常量信息等)。虚拟机启动时创建该区域,关闭时自动释放,当内存不够的时候,会报出异常OutOfMemoryError:Metaspace。
直接内存
并不属于虚拟机的内存结构,其属于操作系统的内存,不由JVM进行管理,常见于NIO操作,用于数据缓冲区。分配回收成本高,读写性能高。该内存区域系统可以访问,java代码也可以访问,用于java代码完成文件拷贝等操作。
类加载器
作用是将字节码文件加载到JVM中。主要分为四类:

  • 启动类加载器主要负责加载核心类
  • 扩展类加载器主要负责加载jre/lib/ext文件夹下的内容
  • 应用类加载器主要负责加载自己定义的类
  • 自定义类加载器主要负责自己实现定义类加载规则

类加载时的双亲委派机制(应用->扩展->启动)可以避免某一个类被重复加载,当父类被加载后无需重复加载,保证了唯一性。
垃圾回收
垃圾回收主要是指堆中的对象。如果一个对象没有任何引用指向他了,就可以被定为垃圾。

  • 引用计数法:每被引用一次增加计量次数,为零则可回收。
  • 可达性分析:GC root出发遍历,看能不能找到,找不到的话就是垃圾。

垃圾回收算法

  • 标记清除算法:速度较快,但容易内存碎片化。
  • 复制算法:将整个内存分为了两个相等的区域,存活对象复制另一个区域。要两块空间,内存使用率较低。
  • 标记整理算法:标记清除后统一移动整理到连续空间,效率较低。

JVM的分代回收
java8中堆中的新生代和老年代比例为1:2。其中新生代里面又分为8:1:1。回收大体过程(最多15次)(AB->C)->(AC->B)。

  • MinorGC:发生在新生代。STOP-THE-WORLD(STW),暂停所有线程,等待垃圾回收完成。
  • Mixed GC:新生代+部分老年代垃圾回收。
  • FullGC:新生代+完整老年代,STW时间长,应尽量避免。

垃圾回收器

  • 串行垃圾回收器:Serial等,STOP-THE-WORLD(STW),暂停所有线程,等待垃圾回收完成。
  • 并行垃圾回收器:Parallel(JDK8默认)等,STOP-THE-WORLD(STW),暂停所有线程,等待垃圾回收完成
  • G1(JDK9后默认
  • GMS(并发垃圾回收器):使用标记清除算法,针对老年代。

G1垃圾回收器(JDK9后默认
划分多个区域,每个区域都可以分为Eden、survivor、old、humongous(用于存储大对象)区域。该回收器采用复制算法

  • 年轻代垃圾回收:Eden->survivor,采用复制算法,要STW。
  • 年轻代垃圾回收+并发标记:当老年代占比内存超过45%后会触发并发标记。
  • 混合收集:优先收集垃圾较多的old区域。

四种引用类型

  • 强引用:只有所有的GC root都找不到才会被回收。
    在这里插入图片描述

  • 软引用:强引用对像所关联的对象引用,内存不足时仅有软件用引用的对象可被回收。

在这里插入图片描述

  • 弱引用:垃圾回收时,不论内存是否充足,都会被回收。
    在这里插入图片描述

  • 虚引用:配合队列使用,当被回收时,释放外部资源。在这里插入图片描述

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

同学yes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值