深入理解JVM

虚拟机(Java Virtual Machine)

在这里插入图片描述

类装载子系统

把class类加载到运行时数据区,主要是加载到方法区

执行引擎

运行字节码文件

运行时数据区

在这里插入图片描述
堆包括年轻代、老年代,年轻代包括Eden区、Survivor0区、Survivor1区。
Eden存放刚new出来的对象,当Eden区满了之后,JVM将会执行minor GC(轻GC,执行效率高),根据可达性分析算法回收垃圾对象,未被回收的将存放到Survivor0区;当Survivor0区满了之后,JVM又会执行minor GC,将垃圾对象回收,未被回收的对象将存放到Survivor1区,并且对象头中存储的分代年龄会+1,当Survivor1满了之后,执行minor GC将垃圾对象回收,未被回收的对象存放到Survivor0区,对象的分代年龄+1,当对象的分代年龄等于15后,此对象将被移入老年代。当老年代满了之后,JVM将会执行full GC,回收垃圾对象,若无法回收对象,释放内存空间,则会报内存空间不足异常。
假设这个堆分配的总空间为600M,老年代则默认占用2/3,即400M;年轻代占用200M,其中Eden区占用80%,即160M;Survivor两个区各占用10%。

在这里插入图片描述
每当有一个新的线程,虚拟机将会在运行时数据区为这个线程分配一块内存区域,用来存放此线程的局部变量。虚拟机会在这一块内存区域中,为此线程调用的其他方法单独划分一块内存区域,当前线程调用了多个方法就会有多个内存区域,这种内存区域就叫栈帧。栈与栈帧的存储方式都为先进后出。
局部变量表存放此栈帧的局部变量,若方法内有对象,因为对象是存放在堆中,所以局部变量只会存储对象地址(即引用),指向堆中的地址;操作数帧用于方法内的计算;程序计数器用于记录当前方法应该执行的字节码行号;动态链接用于存放此方法对应的类元信息地址;方法出口用于记录此方法执行完毕后,主方法继续执行的位置。

方法区

类装载子系统将class类解析、链接等操作后变成类元信息加载到方法区,方法区主要存放常量、静态变量、类元信息。类元信息就是类的组成部分,包括类中的静态变量、方法等;在new某个类A时,堆中会存放类A的地址,类A的对象头里有个类型指针指向对应的类元信息,表示此类A的组成部分。方法区的内存不是使用的系统给JVM分配的内存,而是直接使用的系统物理内存空间。

本地方法栈

用native修饰的方法,底层不是java实现,而是C语言实现,这些方法内部的变量就会存储在本地方法栈中。

可达性分析算法

指的是类加载器、Thread、虚拟机的本地变量表、static成员、常量引用、本地方法栈的变量等。
在这里插入图片描述
该方法的基本思想是通过上述一系列的“GC Roots”对象作为起点进行搜索,如果在“GC Roots”和一个对象之间没有可达路径,则称该对象是不可达的,不过要注意的是被判定为不可达的对象不一定就会成为可回收对象。被判定为不可达的对象要成为可回收对象必须至少经历两次标记过程,如果在这两次标记过程中仍然没有逃脱成为可回收对象的可能性,则基本上就真的成为可回收对象了。在这里插入图片描述
最后面两句将object1和object2赋值为null,也就是说object1和object2指向的对象已经不可能再被访问,但是由于它们互相引用对方,导致它们的引用计数都不为0,那么垃圾收集器就永远不会回收它们。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值