背景

 在阅读本文之前可先了解一下原来写过的一篇关于堆的文章: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-浅堆和深堆的区别?相关推荐

  1. SV学习笔记—浅复制和深复制的区别详解

    目录 1.句柄的复制 2.对象的复制 2.1浅复制shallow copy 2.2深复制deep copy 3.this的用法 在类中,复制一半会涉及到句柄的复制,浅复制和深复制3种操作,下面来看看这 ...

  2. php5对象复制、clone、浅复制与深复制的区别与介绍

    对象复制的由来  为什么对象会有"复制"这个概念,这与PHP5中对象的传值方式是密切相关的,让我们看看下面这段简单的代码 PHP代码 * /**      * * 电视机类     ...

  3. Java clone浅复制与深复制的区别

    1. 概述 Java对象要调用 clone 进行复制,必须实现 Cloneable 接口,否则会抛出CloneNotSupportedException的异常. clone 方法默认是浅复制,如果要实 ...

  4. Python 浅复制和深复制的区别

    Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果. 下面本文就通过简单的例子介绍一下这些概念之间的差别. 对象赋值 直接看一段代码: Pytho ...

  5. 也来谈一谈js的浅复制和深复制

    2019独角兽企业重金招聘Python工程师标准>>> 1.浅复制VS深复制 本文中的复制也可以称为拷贝,在本文中认为复制和拷贝是相同的意思.另外,本文只讨论js中复杂数据类型的复制 ...

  6. 关于编程的浅学习与深学习

    导读:Tanky Woo的程序人生在博客中发表了<关于编程的浅学习与深学习>,文章是关于编程学习的一个提议.归纳.总结. 以下是文章全部内容: 关于编程的学习,大家肯定都知道,也是大家都说 ...

  7. 【JVM笔记】浅堆(Shollow Heap)与深堆(Retained Heap)

    目录 浅堆(Shollow Heap) 保留集(Retained Set) 深堆(Retained Heap) 对象实际大小 浅堆(Shollow Heap) 浅堆(Shallow Heap)是指一个 ...

  8. java 浅堆 深堆_JVM中的一个小知识点:深堆和浅堆的概念

    java中的堆内存算是整个内存区域中最重要的一块,几乎所有的对象都分配在堆内存.在堆内存中有两个主要的概念需要我们理解,这对分析java堆内存的故障有着重要的作用,分别是深堆和浅堆. 一.概念 我们先 ...

  9. java 查看堆外内存占用_如何监控和诊断JVM堆内和堆外内存使用?

    上一讲我介绍了 JVM 内存区域的划分,总结了相关的一些概念,今天我将结合 JVM 参数.工具等方面,进一步分析 JVM 内存结构,包括外部资料相对较少的堆外部分. 今天我要问你的问题是,如何监控和诊 ...

最新文章

  1. 机器学习之监督学习基础
  2. LeetCode53:最大子序和(分治思想,Python3实现)
  3. 【Siddhi】Siddhi 入门案例
  4. rsync安装,配置与错误解析
  5. 开发Google Material Design风格的WPF程序
  6. 【Spring cloud 系列】:构建Eureka Server (02)
  7. React Native升级方法——升级到最新版本0.59
  8. 【一天一个C++小知识】016:c++11中的lambda表达式
  9. Linux 分区简介
  10. cmd关闭计算机指令,取消CMD自动关机的命令是什么
  11. mpeg文件格式分析
  12. python计算圆周率近似值_怎样利用python来计算出圆周率π-百度经验
  13. 4.16周赛---玩游戏
  14. javamail发送SSL---------Unrecognized SSL message, plaintext connection
  15. [附源码]java毕业设计体检中心健康管理系统
  16. [Windows][VC]开机自动启动程序的几种方法
  17. BAPI记录......
  18. CMOS电平的频率限制为什么一般在200M以内
  19. 机器人行业发展方向预测报告
  20. 汽车导航linux系统设计,基于ARM-Linux平台车载导航系统设计与实现

热门文章

  1. 心理测评软件php mysql_心理测评系统
  2. 手机时钟电路中晶振的工作原理简介
  3. 计算机主机内部结构连接,OPS电脑与显示器之间的连接结构的制作方法
  4. 剑灵建元区服务器位置,《剑灵》建元成道地图一览
  5. 一种可以复制钟表零件的石膏模具
  6. 《江畔独步寻花》教学设计
  7. poi-tl生成word文档,java生成word文档
  8. springboot中thymeleaf渲染html模板
  9. 数字后端基本概念介绍Tie cell
  10. 【C++】求三角形面积