GC之二--GC是如何回收时的判断依据、shallow(浅) size、retained(保留) size、Deep(深)size...
回到问题“为何会内存溢出?”。
要回答这个问题又要引出另外一个话题,既什么样的对象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...相关推荐
- JVM系列二:GC策略内存申请、对象衰老
JVM里的GC(Garbage Collection)的算法有很多种,如标记清除收集器,压缩收集器,分代收集器等等,详见HotSpot VM GC 的种类 现在比较常用的是分代收集(generatio ...
- JVM 知识梳理 (二) GC算法
文章目录 一.前言 二.判定哪些对象需要被GC 引用计数法Reference Count 可达性算法(引用链法Tracing) 三.GC算法 标记-清除 标记-压缩 复制算法 总结 分代收集 补充:H ...
- Java垃圾回收(GC)、找垃圾的方式、GC Root、GC停顿、引用、垃圾收集算法、收集器、GC日志、安全点、安全区域
1.垃圾回收 1.1概念 在Java语言中,垃圾回收(Garbage Collection,GC)是一个非常重要的概念. 它的主要作用是回收程序中不再被使用的内存,Java提供的GC功能可以自动监测对 ...
- 36.JVM内存分哪几个区,每个区的作用是什么、如和判断一个对象是否存活、java垃圾回收机制、垃圾收集的方法有哪些、java类加载过程、类加载机制、双亲委派、Minor GC和Major GC
36.JVM内存分哪几个区,每个区的作用是什么? 37.如和判断一个对象是否存活?(或者GC对象的判定方法) 38.简述java垃圾回收机制? 39.java中垃圾收集的方法有哪些? 40.java类 ...
- 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 ...
- gc:C语言的垃圾回收库-中文
Table of Contents gc:标记并清除C的垃圾回收 致谢 文档概述 快速开始 下载,编译和测试 基本用法 核心API 启动,停止,暂停,恢复和运行GC 内存分配和释放 辅助功能 基本概念 ...
- 再谈GC1:GC简介,分代与回收算法
说明:在本文中, Garbage Collection 翻译为 "垃圾收集", garbage collector 翻译为 "垃圾收集器";一般认为, 垃圾回收 ...
- JVM GC(垃圾回收机制)Minro GC,Major GC/Full GC
在学习Java GC 之前,我们需要记住一个单词:stop-the-world .它会在任何一种GC算法中发生.stop-the-world 意味着JVM因为需要执行GC而停止了应用程序的执行.当st ...
- 一个利用System.gc和finalize研究Java垃圾回收机制的练习
源代码: package basic;public class finalizeTest {private String name;public void finalize(){System.out. ...
最新文章
- mysql lint的范围_【MySQL】MySQL数据类型
- 16 级高代 II 思考题十的多种证明
- php 点击选择图片上传,快速实现PHP图片上传和预览
- html5 浏览器退回事件,html5的pushstate以及监听浏览器返回事件的实现
- Hyperledger中数据存取的实现
- Linux命令之basename 命令
- mysql5.0.x统计每秒增删改查替换数及系统每秒磁盘IO
- 个人中心html界面设计,APP个人中心页面设计
- 介绍打印机脱机的四种恢复方法
- 大型在线考试答题系统源码 B/S架构
- 回复git@vger.kernel.org的注意事项
- 图卷积网络GRAPH CONVOLUTIONAL NETWORKS
- Tangle:不同于区块链的分布式账本
- 如何有效的关闭Win10/ win 11 自动更新? 方法最全
- 【机器学习】算法 之 决策树
- 有没有测试手机硬件是否损坏的软件,怎么检测手机硬件故障
- 揭开中本聪的真实身份?这只是杀毒软件之父疯狂人生中的一件小事
- 基于SSM实现的物流管理系统(完美运行,包含数据库源代码,可远程调试)
- python第二周day2
- 同一页面无法显示多个模态框的解决办法