JAVA 内存回收

本文深入解析Java中GCRoot的概念,包括虚拟机栈、方法区中的引用,以及本地方法栈中的JNI引用。探讨了对象引用的四种类型:强引用、弱引用、软引用和虚引用,并详细介绍了Java垃圾回收算法,包括引用计数算法、根可达性算法、标记清除算法、标记整理算法和复制算法。最后,阐述了分代回收策略,涉及年轻代、老年代和持久代的不同作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:https://www.cnblogs.com/leesf456/p/5218594.html

1,JMV 中哪些可以作为 GC Root?

    1. 虚拟机栈(栈帧中的局部变量区,也叫做局部变量表)中引用的对象。

    2. 方法区中的类静态属性引用的对象。

    3. 方法区中常量引用的对象。

    4. 本地方法栈中JNI(Native方法)引用的对象。

2,对象的引用:

    强引用

    弱引用:在内存溢出前(会尝试回收部分内存)

    软引用:在下一次垃圾搜集时

    虚引用:垃圾回收时,收到系统通知。

3, java 垃圾回收算法: 引用计数算法 和 根可达性算法。 引用计数算法是早起的垃圾回收算法,在对象出现循环引用的情况下,不方便回收。 根搜索算法,从根节点开始搜索引用的节点,没有被引用的节点,则是可回收的节点。

  • 标记清除算法:mark & sweep : 效率高,对不使用的对象直接清除,会造成内存碎片。
  • 标记整理算法:collection : 在标记后,将存活的对象向左边移动。解决了内存碎片问题,但是成本更高。
  • 复制算法:将内存分成空闲区和对象区,在gc的时候,总是copy存活的对象到空闲区,因此空闲区域和对象区域总是对调。
  • 分代回收策略:年轻代,老年代,持久代。

    在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。

    2.内存比新生代也大很多(大概比例是1:2),当老年代内存满时触发Major GC即Full GC,Full GC发生频率比较低,老年代对象存活时间比较长,存活率标记高。

    持久代(Permanent Generation)

    用于存放静态文件,如Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate 等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。

 

 

 

 

转载于:https://my.oschina.net/u/592116/blog/2250379

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值