《深入理解java虚拟机》第三章读书心得

这一章主要讲了垃圾收集器和内存分配策略
程序计数器、方法栈、虚拟机栈随线程而生,随线程而灭,不需要进行内存回收,内存回收的主要是堆和方法区内存
垃圾回收的算法主要有:

  1. 引用计数法:给对象添加一个引用计数器,有一个地方引用它,计数器值加1,反之减1,当计数器值为0时这个对象就会被回收。这个算法实现比较简单,判定效率比较高。也有一个缺点,就是对象之间互相引用时,这个算法没办法GC回收。
  2. 可达性分析算法:通过一系列称为“GC Roots” 的对象作为起始点,从这些节点向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots 没有任何引用链链接时,证明这个对象是不可用的。
  3. 标记-清除算法:分为两个阶段,对对象进行标记,标记出来所有需要回收的对象,第二步,清除需要被回收的对象。这个算法有两个缺点:
    1.效率问题,标记和清楚的效率都不高。2. 标记清除后会产生大量的空间碎片。
  4. 复制算法:将内存按照容量分为相等两部分,每次只使用其中的一块。当其中一块内存使用完了,将存活的对象复制到另一块内存中,把使用过的那块内存空间清理掉。这种方法不会产生空间碎片,但是会缩小使用内存
  5. 标记- 整理算法: 标记过程和“标记-清除”算法一样,后续步骤为让存活的对象向一端移动,然后直接清理掉端边界外的内存。

引用

Java引用分为四种:强引用、软引用、弱引用、虚引用,引用强度依次减弱。
强引用:程序中使用最多的引用,例如: String s = new String(“s”);
软引用: 内存不够时会被清除的引用。例如:

// 注意:wrf这个引用也是强引用,它是指向SoftReference这个对象的,
// 这里的软引用指的是指向new String("str")的引用,也就是SoftReference类中T
SoftReference<String> wrf = new SoftReference<String>(new String("str"));

弱引用:垃圾收集器发现了它就会被回收。
虚引用:虚引用的回收机制跟弱引用差不多,但是它被回收之前,会被放入ReferenceQueue中。注意哦,其它引用是被JVM回收后才被传入ReferenceQueue中的。由于这个机制,所以虚引用大多被用于引用销毁前的处理工作。还有就是,虚引用创建的时候,必须带有ReferenceQueue

关于引用这部分我也不是很理解,感兴趣的朋友可以自己搜集学习相关知识,以后我会学习一下这部分进行专门的讲解。
Hotspot VM 使用的是分代收集算法:将内存分为新生代和老年代。
新生代内存一般使用复制算法。将新生代内存分为三部分:Eden空间和两块较小的Survivor空间,内存大小比例是8:1:1,刚创建的对象会被存放在Eden区,Eden区满之后会触发GC,将eden区的存活对象复制到Survivor1区,当Survivor1区满之后会把存活对象复制到Survivor2区,清空eden区和Survivor1区,将Survivor1区和Survivor2区互换位置,保持Survivor2区的空闲状态,如果内存过多存放不下会将存活对象复制到老年区,并清空新生代,如此反复。如果老年代满了,会触发Full GC 。老年代存放的都是存活时间或者周期比较长的对象。
垃圾收集器
收集算法是内存回收的方法论,垃圾收集器是内存回收的具体实现。
垃圾收集器有serial、ParNew、CMS等

本菜鸟自己创建的交流群,欢迎大佬和java学习者加入扣扣群:344635699

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值