回到问题“为何会内存溢出?”。

要回答这个问题又要引出另外一个话题,既什么样的对象GC才会回收?

一、对象存活方式判断方法

在上一篇文章《GC之一--GC 的算法分析、垃圾收集器、内存分配策略介绍》中的“二、对象存活判断”中介绍了,判断对象是否存活一般有两种方式:

  • 引用计数:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收。此方法简单,无法解决对象相互循环引用的问题。
  • 根搜索算法/可达性分析(Reachability Analysis):从GC Roots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。

而且文章中还验证了JVM是通过根搜索算法进行的,而不是通过引用计数方式。

二、java对象的引用

从最强到最弱,不同的引用(可到达性)级别反映了对象的生命周期。见《对象的强、软、弱和虚引用》

  • l  Strong Ref(强引用):通常我们编写的代码都是Strong Ref,于此对应的是强可达性,只有去掉强可达,对象才被回收。
  • l  Soft Ref(软引用):对应软可达性,只要有足够的内存,就一直保持对象,直到发现内存吃紧且没有Strong Ref时才回收对象。一般可用来实现缓存,通过java.lang.ref.SoftReference类实现。
  • l  Weak Ref(弱引用):比Soft Ref更弱,当发现不存在Strong Ref时,立刻回收对象而不必等到内存吃紧的时候。通过java.lang.ref.WeakReference和java.util.WeakHashMap类实现。
  • l  Phantom Ref(虚引用):根本不会在内存中保持任何对象,你只能使用Phantom Ref本身。一般用于在进入finalize()方法后进行特殊的清理过程,通过java.lang.ref.PhantomReference实现。

有了上面的种种我相信很容易就能把heap和perm gen撑破了吧,是的利用Strong Ref,存储大量数据,直到heap撑破;利用interned strings(或者class loader加载大量的类)把perm gen撑破。

三、关于shallow size、retained size、Deep size

也有称为Shallow heap、retained heap、deep heap

Shallow(浅) size:就是对象本身占用内存的大小,不包含对其他对象的引用,也就是对象头加成员变量(不是成员变量的值)的总和。在32位系统上,对象头占用8字节,int占用4字节,不管成员变量(对象或数组)是否引用了其他对象(实例)或者赋值为null它始终占用4字节。故此,对于String对象实例来说,它有三个int成员(3*4=12字节)、一个char[]成员(1*4=4字节)以及一个对象头(8字节),总共3*4 +1*4+8=24字节。根据这一原则,对String a=”rosen jiang”来说,实例a的shallow size也是24字节(很多人对此有争议,请看官甄别并留言给我)。

Retained(保留) size:是该对象自己的shallow size,加上从该对象能直接或间接访问到对象的shallow size之和。换句话说,retained size是该对象被GC之后所能回收到内存的总和。为了更好的理解retained size,不妨看个例子。

把内存中的对象看成下图中的节点,并且对象和对象之间互相引用。这里有一个特殊的节点GC Roots,正解!这就是reference chain的起点。

从obj1入手,上图中蓝色节点代表仅仅只有通过obj1才能直接或间接访问的对象。因为可以通过GC Roots访问,所以左图的obj3不是蓝色节点;而在右图却是蓝色,因为它已经被包含在retained集合内。

所以对于左图,obj1的retained size是obj1、obj2、obj4的shallow size总和;右图的retained size是obj1、obj2、obj3、obj4的shallow size总和。obj2的retained size可以通过相同的方式计算。

Deep(深) size:包含那些对象的大小。深大小与保留大小的区别在于那些存在共享的对象。

如图,Flute Duo对象的深大小包含Michael对象消耗的内存空间,但是保留大小则不包括。(Person Michael是Trio和Flute Duo所共享的)

看堆内存分析工具中展示的都是

GC之二--GC是如何回收时的判断依据、shallow(浅) size、retained(保留) size、Deep(深)size...相关推荐

  1. JVM系列二:GC策略内存申请、对象衰老

    JVM里的GC(Garbage Collection)的算法有很多种,如标记清除收集器,压缩收集器,分代收集器等等,详见HotSpot VM GC 的种类 现在比较常用的是分代收集(generatio ...

  2. JVM 知识梳理 (二) GC算法

    文章目录 一.前言 二.判定哪些对象需要被GC 引用计数法Reference Count 可达性算法(引用链法Tracing) 三.GC算法 标记-清除 标记-压缩 复制算法 总结 分代收集 补充:H ...

  3. Java垃圾回收(GC)、找垃圾的方式、GC Root、GC停顿、引用、垃圾收集算法、收集器、GC日志、安全点、安全区域

    1.垃圾回收 1.1概念 在Java语言中,垃圾回收(Garbage Collection,GC)是一个非常重要的概念. 它的主要作用是回收程序中不再被使用的内存,Java提供的GC功能可以自动监测对 ...

  4. 36.JVM内存分哪几个区,每个区的作用是什么、如和判断一个对象是否存活、java垃圾回收机制、垃圾收集的方法有哪些、java类加载过程、类加载机制、双亲委派、Minor GC和Major GC

    36.JVM内存分哪几个区,每个区的作用是什么? 37.如和判断一个对象是否存活?(或者GC对象的判定方法) 38.简述java垃圾回收机制? 39.java中垃圾收集的方法有哪些? 40.java类 ...

  5. 4、JVM垃圾回收机制、新生代的GC、GC(Minor GC、FullGC)、GC日志、JVM参数选项、元空间(笔记)

    4.JVM垃圾回收机制 4.1.新生代的GC 4.1.1.串行GC(SerialGC) 4.1.2.并行回收GC(Parallel Scavenge) 4.1.3.并行GC(ParNew) 4.2.G ...

  6. gc:C语言的垃圾回收库-中文

    Table of Contents gc:标记并清除C的垃圾回收 致谢 文档概述 快速开始 下载,编译和测试 基本用法 核心API 启动,停止,暂停,恢复和运行GC 内存分配和释放 辅助功能 基本概念 ...

  7. 再谈GC1:GC简介,分代与回收算法

    说明:在本文中, Garbage Collection 翻译为 "垃圾收集", garbage collector 翻译为 "垃圾收集器";一般认为, 垃圾回收 ...

  8. JVM GC(垃圾回收机制)Minro GC,Major GC/Full GC

    在学习Java GC 之前,我们需要记住一个单词:stop-the-world .它会在任何一种GC算法中发生.stop-the-world 意味着JVM因为需要执行GC而停止了应用程序的执行.当st ...

  9. 一个利用System.gc和finalize研究Java垃圾回收机制的练习

    源代码: package basic;public class finalizeTest {private String name;public void finalize(){System.out. ...

最新文章

  1. mysql lint的范围_【MySQL】MySQL数据类型
  2. 16 级高代 II 思考题十的多种证明
  3. php 点击选择图片上传,快速实现PHP图片上传和预览
  4. html5 浏览器退回事件,html5的pushstate以及监听浏览器返回事件的实现
  5. Hyperledger中数据存取的实现
  6. Linux命令之basename 命令
  7. mysql5.0.x统计每秒增删改查替换数及系统每秒磁盘IO
  8. 个人中心html界面设计,APP个人中心页面设计
  9. 介绍打印机脱机的四种恢复方法
  10. 大型在线考试答题系统源码 B/S架构
  11. 回复git@vger.kernel.org的注意事项
  12. 图卷积网络GRAPH CONVOLUTIONAL NETWORKS
  13. Tangle:不同于区块链的分布式账本
  14. 如何有效的关闭Win10/ win 11 自动更新? 方法最全
  15. 【机器学习】算法 之 决策树
  16. 有没有测试手机硬件是否损坏的软件,怎么检测手机硬件故障
  17. 揭开中本聪的真实身份?这只是杀毒软件之父疯狂人生中的一件小事
  18. 基于SSM实现的物流管理系统(完美运行,包含数据库源代码,可远程调试)
  19. python第二周day2
  20. 同一页面无法显示多个模态框的解决办法

热门文章

  1. 上海day2--两年前最烧脑的环境变量
  2. servlet 校验密码
  3. vue全家桶项目搭建(vue-cli 2.9.6+vue-router+vuex+axios)
  4. Docker+Mongodb
  5. codevs 1376 帕秋莉•诺蕾姬
  6. iOS-获取子视图父控制器
  7. 推荐几个MySQL大牛的博客
  8. 1048 采药 1049 装箱问题
  9. iOS:极光推送控制器跳转
  10. [实变函数]4.4 依测度收敛