new关键字发生了什么系列补充(Java内存结构与垃圾回收问题)

前言

学习了之前的一些知识之后,为了给自己学习之前的问题做简单的解答

0x01 如何判断垃圾

首先通过可达性分析算法分析(没有gc roots),然后在jvm中进行标记,finalize方法中可以取消标记(重新获取gc roots)。

判断垃圾这个阶段是在发生gc的时候,垃圾收集器需要根据该方式确定垃圾并回收。

0x02 对象在堆内存中如何分配

1、是否在TLAB上分配
2、jvm参数检查,内存需要分配在哪里(常见垃圾收集器将堆内存继续划分)
3、新生代分配(栈上有引用,堆中有实例数据,方法区有Class对象,常量池有常量)
4、内存不足,发生gc垃圾回收
5、对象基础信息初始化等

0x03 对象在堆内存中如何回收

不同的垃圾收集器回收算法不同,新生代的垃圾通常采用复制算法,老年代采用标记-清除算法或标记-整理算法。

不同的算法可能也会导致不同的问题,比如cms中的标记-清除算法以及cms独特的实现机制,可能在一次gc中触发另一次gc

0x04 什么时候发生gc

情况一:创建新对象的时候,由于内存不足,需要一次gc

情况二:前一次gc可能触发另一次gc,比如cms老年代收集失败

0x05 什么时候发生minor gc

分配对象实例内存时,Eden空间内存不足

0x06 什么时候发生full gc

情况一:发生minor gc前,cms垃圾收集器要求老年代进行一个担保,可能导致垃圾回收

情况二:直接分配在老年代的时候,如果老年代内存不足,可能触发

情况三:hotspot将方法区放在永久代实现,如果需要加载更多类,则触发

情况四:System.gc()方法

0xFF 总结

垃圾收集就是内存回收,为了程序能继续运行,需要将程序运行期间产生的内存垃圾清空,否则再大的内存也不够程序执行。如何高效的在程序执行的期间也能进行垃圾的收集就是一件很重要的事情,因为编写java程序不需要主动去回收内存垃圾,所以jvm替我们完成这项工作。

因此,jvm进一步抽象了内存空间,对内存空间进一步划分,是为了更好的收集内存。虽然jvm可能不同,垃圾收集器也不同,但是java在内存结构的划分给了一份规范。所以其他jvm实现厂商在此规范上进行开发。虽然不同的jvm有不同的实现,但是在大方向上,基本都是能够形成统一。

了解垃圾回收虽然不能帮助我们写出更好的代码,但是在了解之后我们写代码会更慎重,比如设置Map的大小能减少gc等

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值