java中jvm内存模型解析以及GC回收机制

java中jvm内存模型解析以及GC回收机制

jvm是什么

Java Virtual Machine,也就是Java虚拟机,java程序的跨平台特性主要是指字节码文件可以在任何具有java虚拟机的计算机或设备上运行。
在这里插入图片描述

jvm内存模型结构

jvm内存模型结构包括五大区域,分别为栈(jvm栈)、堆、本地方法栈、程序计数器、方法区。
在这里插入图片描述
栈:Java线程执行方法的内存模型,一个线程对应一个栈,每个方法在执行的同时都会创建一个栈帧(用于存储局部变量表,操作数栈,动态链接,方法出口等信息)不存在垃圾回收问题,只要线程一结束该栈就释放,生命周期和线程一致。

堆:Java虚拟机管理的最大的一块内存区域,Java堆是线程共享的,用于存放对象实例。也就是说对象的出生和回收都是在这个区域进行的。

本地方法栈:和栈作用很相似,区别不过是Java栈为JVM执行Java方法服务,而本地方法栈为JVM执行native方法服务。登记native方法,在Execution Engine执行时加载本地方法库。

程序计数器:就是一个指针,指向方法区中的方法字节码(用来存储指向下一个指令的地址,也即将要执行的指令代码),由执行引擎读取下一条指令,是一个非常小的内存空间,几乎可以忽略不计。

方法区:线程共享,用于存储已经被虚拟机加载的类信息、常量、静态变量等数据。
JDK1.8与1.7最大的区别是在1.8中方法区是由元空间(元数据区)来实现。常量池移到堆中。

其中栈、本地方法栈、程序计数器是线程私有,也就意味着有多少线程就会有多少栈区,本地方法栈区、程序计数器区。而堆区和方法区是全局共享的。

GC垃圾回收机制

当一个函数执行时,对应着jvm栈中会开辟一块空间,对应着存放函数中创建的对象在堆中的地址值,当函数执行完毕,随着线程结束,栈中区域会自动清除,但是堆中开辟的存放对象内容的空间不会随之清除,因为无法确定其他线程是否也引用了堆中此对象,因而用到了GC回收机制。

堆区空间结构

堆中的空间是用来存储我们new出来的对象的,每一个对象都会在堆区占用一块空间,当堆区空间满了之后内存就会爆掉,程序会挂掉。

堆区空间结构

所以在进行回收时,我们应该判断这个对象是否应该被清除,那么判断的标准是什么呢?这时会采取一些算法进行相应的清理操作。
**1.标记清理算法:**对一个对象需要被删除时进行标记处理,然后将标记的对象全部清理掉,幸存下来的对象进入到S0或S1区,但是此清除算法在对象被删除之后会在内存中产生内存碎片,内存碎片例如两个对象大小分别是1k,其被清理后会产生一个2k的内存区域,此时有一个2k的内存对象,是不能够进行存放的,所以清理后的2k内存空间不能被合理的利用起来,所以会有另外一种算法进行应对,也就是标记整理算法。
**2.标记整理算法:**此算法和标记清理算法相似,但是当内存对象被清理后产生空间,所有存在的对象会往前顶,占用掉被清理的空间,提高内存空间利用率减少内存碎片,但此算法缺点是代价较大,所有的内存对象都会前移。
**3.复制算法:**此算法将内存分为两个区域,当标记的对象需要清理时,将不需要清理的对象全部紧凑复制到另一个区,需要清理的就不进行复制,这样会减少开销,但是复制算法缺点是需要两倍的内存。

堆区内存实际进行GC算法时要复杂得多。

**4.分代收集算法:**现在的虚拟机垃圾收集大多采用这种方式,它根据对象的生存周期,将堆分为新生代(Young)和老年代(Tenure)。在新生代中,由于对象生存期短,每次回收都会有大量对象死去,那么这时就采用复制算法。老年代里的对象存活率较高,没有额外的空间进行分配担保,所以可以使用标记-整理 或者 标记-清除。(如上图)

本人第一次写博客,技术较差,如有错误欢迎指正。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值