专栏首页技术趋势JVM-浅堆和深堆的区别?

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

文章分享自微信公众号:
技术趋势

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

作者:逍遥壮士
原始发表时间:2022-02-01
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • 堆和栈的区别

    用户1941540
  • 堆和栈的区别

    一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量...

    Angel_Kitty
  • 堆和栈的区别

    栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 堆区(heap) — 一般由程序员分配释放,...

    心跳包
  • 堆和栈的区别

    堆和栈的区别 一般认为在c中分为这几个存储区 1栈 - 有编译器自动分配释放 2堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收...

    猿人谷
  • 堆和栈的区别

    使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,...

    用户3145847
  • 堆和栈的区别

    一、预备知识—程序的内存分配          一个由C/C++编译的程序占用的内存分为以下几个部分     1、栈区(stack)— 由编译器自动分配释放,存...

    互联网金融打杂
  • 堆和栈的区别

    堆(heap)和栈(stack) 在计算机领域,堆栈是一个不容忽视的概念,堆栈是两种数据结构。堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(...

    Steve Wang
  • 堆和栈_数据结构堆和栈的区别

    在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到。但对于很多的初学着来说,堆栈是一个很模糊的概念。堆栈:一种数据结构、一个在程序运行时...

    全栈程序员站长
  • Java堆和栈的区别

    在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作...

    Java团长
  • 堆和栈的概念和区别

    是阿超
  • 堆和栈的区别(队列和栈的区别)

    堆(Heap)与栈(Stack)是开发人员必须面对的两个概念,在理解这两个概念时,需要放到具体的场景下,因为不同场景下,堆与栈代表不同的含义。一般情况下,有两层...

    全栈程序员站长
  • Java中堆和栈的区别

    (1)Java的堆是一个运行时数据区,类的对象从堆中分配空间。这些对象通过new等指令建立,通过垃圾回收器来销毁。

    Java团长
  • c浅拷贝和深拷贝的区别_js中深拷贝和浅拷贝的区别

    先考虑一种情况,对一个已知对象进行拷贝,编译系统会自动调用一种构造函数——拷贝构造函数,如果用户未定义拷贝构造函数,则会调用默认拷贝构造函数。

    全栈程序员站长
  • java中堆和栈的区别

    堆和栈都是Java用来在RAM中存放数据的地方。 堆 (1)Java的堆是一个运行时数据区,类的对象从堆中分配空间。这些对象通过new等指令建立,通过垃圾回收器...

    nnngu
  • Java中的堆和栈的区别

    当一个人开始学习Java或者其他编程语言的时候,会接触到堆和栈,由于一开始没有明确清晰的说明解释,很多人会产生很多疑问,什么是堆,什么是栈,堆和栈有什么区别?更...

    java达人
  • Stack and Heap 堆和栈的区别include

    在和计算机内存打交道时,我们一定会碰到堆和栈,这两个东西很容易搞混,那么现在就来梳理一下二者的关系。 栈(Stack)是用来静态分配内存的而堆是动态分配内存的,...

    Albert陈凯
  • Java堆内存和栈内存的区别

    对于这个名词来说,它描述的其实是JVM的内存模型, 如果面试中问到,堆栈具体对应着什么,不知道是否了解?

    PhoenixZheng
  • Java中的堆和栈的区别

    当一个人开始学习Java或者其他编程语言的时候,会接触到堆和栈,由于一开始没有明确清晰的说明解释,很多人会产生很多疑问,什么是堆,什么是栈,堆和栈有什么区别?更...

    技术小黑屋
  • java浅拷贝和深拷贝的区别_python的浅拷贝和深拷贝

    Java中的对象拷贝(Object Copy)指的是将一个对象的所有属性(成员变量)拷贝到另一个有着相同类类型的对象中去。举例说明:比如,对象A和对象B都属于类...

    全栈程序员站长

扫码关注腾讯云开发者

领取腾讯云代金券