JVM-浅堆和深堆的区别?
背景
在阅读本文之前可先了解一下原来写过的一篇关于堆的文章:jvm堆
java堆内存里面存放着各种对象,而大部分我们的对象存放于堆中,但堆又分为浅堆和深堆,主要区别于堆的大小和被GC回收后,可以释放内存的大小。
浅堆(Shallow Head)是什么?
浅堆指一个对象所消耗的内存,当在32位系统中,一个对象引用会占据4个字节(32位),比如一个Int类型的对象会占据4个字节,而long类型的变量会占8个字节,每个对象头都会占据8个字段,由于堆的快照格式不同,对象的大小可能存在同8字节进行对齐。(JDK7)
大小计算:浅堆大小 = 对象头 + 实例数据 + 对齐填充
对象类型 |
名称 |
占用字节 |
int |
hash32 |
4 |
int |
hash |
4 |
ref |
value |
8 |
head |
对象头 |
8 |
padding |
填充 |
4 |
比如:一个StrIng 里面有2个int 共占8个字节,对象引用占4个字节,对象头占用8个字节,填充头 4个字段,总共24个字节,这24就是最终这个浅堆的大小。
注意这里,浅堆的引用可能引用了非常多的对象,这里浅堆不需要关心,仅计算该引用的大小固定为4,而深堆才关心具体引用内容大小。
深堆(Retained Heap)是什么?
在了解深堆之前需要先了解一下保留集(Retained Set),指对象被垃圾回收后,可以被释放所有对象的集合,即对仅能通过对象引用到的直接或间接的所有对象的集合。
个人理解:比如下面的A、B、C、D、E,其中A引用了 C D 而B 引用了D E,只能通过A直接或间接引用的用只有C,而只能通过B直接或间引用只有E,其中D是被共用,所以不被任何一个对象占有,所以B不属于任保一个保留集。
了解以上的保留集,再来了解深堆就很简单了,深堆指对象的保留集所有的对象浅堆大小的总和。
深堆大小:对象本身+指向的保留集
比如:B的大小是:B+E
对象实际大小计算:浅堆大小+引用的大小
比如:B的实际在小是 B+ D+ E
注意:以上的浅堆、深堆、对象实际大小计算各不相同;
最后
浅堆和深堆在面试中,经常会用来提前面试者,这两者有什么区别,有什么关系,怎么计算大小等。对于我们来说,除了可能面试会用上,实际开发过程中,也有很好的学习作用,比如太多的引用你会发现OOM,这种溢出或者泄露的问题排查以及代码的鲁棒性是不是更佳等,以及使用一个内存分析工具经常也会用来进行分析的指标,比如MAT、jprofiler等。
参考文章:
https://www.imooc.com/article/317274
https://my.oschina.net/aidelingyu/blog/1602341
JVM-浅堆和深堆的区别?相关推荐
- SV学习笔记—浅复制和深复制的区别详解
目录 1.句柄的复制 2.对象的复制 2.1浅复制shallow copy 2.2深复制deep copy 3.this的用法 在类中,复制一半会涉及到句柄的复制,浅复制和深复制3种操作,下面来看看这 ...
- php5对象复制、clone、浅复制与深复制的区别与介绍
对象复制的由来 为什么对象会有"复制"这个概念,这与PHP5中对象的传值方式是密切相关的,让我们看看下面这段简单的代码 PHP代码 * /** * * 电视机类 ...
- Java clone浅复制与深复制的区别
1. 概述 Java对象要调用 clone 进行复制,必须实现 Cloneable 接口,否则会抛出CloneNotSupportedException的异常. clone 方法默认是浅复制,如果要实 ...
- Python 浅复制和深复制的区别
Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果. 下面本文就通过简单的例子介绍一下这些概念之间的差别. 对象赋值 直接看一段代码: Pytho ...
- 也来谈一谈js的浅复制和深复制
2019独角兽企业重金招聘Python工程师标准>>> 1.浅复制VS深复制 本文中的复制也可以称为拷贝,在本文中认为复制和拷贝是相同的意思.另外,本文只讨论js中复杂数据类型的复制 ...
- 关于编程的浅学习与深学习
导读:Tanky Woo的程序人生在博客中发表了<关于编程的浅学习与深学习>,文章是关于编程学习的一个提议.归纳.总结. 以下是文章全部内容: 关于编程的学习,大家肯定都知道,也是大家都说 ...
- 【JVM笔记】浅堆(Shollow Heap)与深堆(Retained Heap)
目录 浅堆(Shollow Heap) 保留集(Retained Set) 深堆(Retained Heap) 对象实际大小 浅堆(Shollow Heap) 浅堆(Shallow Heap)是指一个 ...
- java 浅堆 深堆_JVM中的一个小知识点:深堆和浅堆的概念
java中的堆内存算是整个内存区域中最重要的一块,几乎所有的对象都分配在堆内存.在堆内存中有两个主要的概念需要我们理解,这对分析java堆内存的故障有着重要的作用,分别是深堆和浅堆. 一.概念 我们先 ...
- java 查看堆外内存占用_如何监控和诊断JVM堆内和堆外内存使用?
上一讲我介绍了 JVM 内存区域的划分,总结了相关的一些概念,今天我将结合 JVM 参数.工具等方面,进一步分析 JVM 内存结构,包括外部资料相对较少的堆外部分. 今天我要问你的问题是,如何监控和诊 ...
最新文章
- 机器学习之监督学习基础
- LeetCode53:最大子序和(分治思想,Python3实现)
- 【Siddhi】Siddhi 入门案例
- rsync安装,配置与错误解析
- 开发Google Material Design风格的WPF程序
- 【Spring cloud 系列】:构建Eureka Server (02)
- React Native升级方法——升级到最新版本0.59
- 【一天一个C++小知识】016:c++11中的lambda表达式
- Linux 分区简介
- cmd关闭计算机指令,取消CMD自动关机的命令是什么
- mpeg文件格式分析
- python计算圆周率近似值_怎样利用python来计算出圆周率π-百度经验
- 4.16周赛---玩游戏
- javamail发送SSL---------Unrecognized SSL message, plaintext connection
- [附源码]java毕业设计体检中心健康管理系统
- [Windows][VC]开机自动启动程序的几种方法
- BAPI记录......
- CMOS电平的频率限制为什么一般在200M以内
- 机器人行业发展方向预测报告
- 汽车导航linux系统设计,基于ARM-Linux平台车载导航系统设计与实现