Java 内存管理和垃圾回收机制

上一博内容比较杂,都是根据别人的面经整理的一些答案,有些地方写的比较浅,还需要自己去深刻理解一下。

Java 虚拟机垃圾回收机制

首先需要查看对象是否存活,需要验证。

可达性分析算法

通过一系列称为“GC Roots" 的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明这个对象是不可用的。

判断对象生存还是死亡

  1. 如果对象在进行可达性分析发现没有与GC Roots相连接的引用链,那么它将会被第一次标记兵器进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法;

  2. 当对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过,虚拟机将这两种情况都视为“没有必要执行”。

垃圾收集算法

  • 标记-清除算法

首先标出需要回收的对象,在标记完成后统一回收所有被标记的对象。这种方法可能会造成内存碎片

  • 复制算法

将可用内存按容量划分为大小相等的两块,每次只使用一块。

  • 标记-整理算法

先标记,再让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。

  • 分代收集算法

在新生代中,每次垃圾收集时都会有大批对象死去,只有少量存活,那就选用复制算法。而老年代中因为对象存活率高,没有额外空间对他进行分配担保,使用“标记-清理”或“标记-整理”算法进行回收。

垃圾收集器

  • Serial 收集器

Serial 收集器是最基本,历史最悠久的收集器。它是以单线程工作的收集器,当它开始工作的时候,必须暂停其他所有的工作线程,直到他收集结束。

  • ParNew 收集器

ParNew收集器是Serial收集器的多线程版本,除了使用多线程之外,其余行为都与Serial收集器完全一样。

内存分配与回收策略

几条最基本的内存分配策略

  • 对象优先在Eden分配

大多数情况下,对象在新生代Eden区中分配。当Eden区没有足够的空间进行分配时,虚拟机将发生一次Mintor GC

  • 大对象直接进入老年代

大对象指的是需要大量连续内存空间的java对象,最典型的就是长的字符串或数组。

  • 长期存活的对象直接进入老年代

在发生Minor GC之前,虚拟机会先检查老年代最大可用的连续空间是否大于新生代所有对象总空间,如果这个条件成立,那么Minor GC可以确保是安全的。

一个对象的这一辈子

我是一个普通的Java对象,我出生在Eden区,在Eden区我还看到和我长的很像的小兄弟,我们在Eden区中玩了挺长时间。有一天Eden区中的人实在是太多了,我就被迫去了Survivor区的“From”区,自从去了Survivor区,我就开始漂了,有时候在Survivor的“From”区,有时候在Survivor的“To”区,居无定所。直到我18岁的时候,爸爸说我成人了,该去社会上闯闯了。于是我就去了年老代那边,年老代里,人很多,并且年龄都挺大的,我在这里也认识了很多人。在年老代里,我生活了20年(每次GC加一岁),然后被回收。

输入图片说明

转载于:https://my.oschina.net/u/1447519/blog/1549305

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值