Java 垃圾回收GC

1、我们都知道JVM中的栈和计算器是线程私有的,及栈的生命周期是和线程的生命周期一样的,而栈中存储的还包括java的基本数据类型(boolean、byte、char、short、int、float等等)。

2、类加载器读取完毕类对应的字节码文件时就已经能确定这个类型的大小了。

基于1、2俩点来提出正文内容。

静态内存分配回收

在java编译的时候就已经确定需要的空间大小,系统一次性分配给它,之后并不会变化,局部变量包括的基本数据类型、对象的引用都是静态分配内存的。上面1、2点我也提到了,这个在执行结束之后自动会回收的,我们不需要太操心。

动态分配内存

java对象的空间都是动态分配的,执行过程中才能确定空间大小,什么时候回收不是确定的,这个才是我们要讨论的重头戏——JVM垃圾收集处理

如何检测垃圾

JVM做垃圾回收时会检查堆中的所有对象是否会被根对象直接或者间接引用,有引用的就是活动对象,否则就可以进行回收了。

基于分代的垃圾收集算法(Hotspot)

将堆总体分为三块区域:1、年轻代区 2、老生代区 3、永生区

  • 年轻代区还分为Eden区和俩个Survivor区,所有新创建的对象都在Eden区,Eden区满后会触发minorGC将Eden区扔存活的对象复制到其中一个survivor区,另一个survivor区也将存活对象复制到这个survivor区中,尽量保持一个survivor区是空的。

  • 老生代区存放的是年轻代区触发minorGC后仍存活的对象;年轻代的Eden区满后会放到survivor区中,如果survivor区还是存放不下这些对象,GC收集器会将这些对象直接放到老生代区;如果老生代区也满了那么将会触发FullGC回收整个堆内存。

  • 永生区存放的主要是Class对象,如果一个类频繁的被加载可能会导致永生区满,永生区的垃圾回收是由FullGC负责的。 (永生区对应在堆划分中的方法区)

VisualGC插件可以查看每个代的当前内存大小和回收的次数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值