概述

浅堆表示一个对象结构所占用的大小(对象头+实例数据+对齐填充,不包括内部引用 对象大小)

深堆表示一个对象被 GC 回收后,可以真实释放的内存大小(保留空间)

对象

对象 = 对象头 + 实例数据 + 对齐填充

对象头

对象头 = 标记部分 + 原始对象引用

标记部分包括 hashcode、gc 分代年龄、锁状态标志、线程持有锁、偏向线程锁id,偏向时间戳,这一部分在32位机器上为 4 byte,64 位机器上为 8byte

原始对象引用是对象的指针、通过这个指针找到对象的实例、该数据可以压缩,这一部分在 32 位机器上为 4 byte,64位机器上为 8byte,如果开启了压缩(UseCompreddedOops),大小为 4byte,jdk8默认开启压缩

结论:一个对象头大小(64 位) = 12 byte(压缩) / 16 byte(未压缩)

实例数据类型

大小(byte)

byte

1

boolean

1

char

2

short

2

int

4

float

4

double

8

long

8

对齐填充

任何对象都以 8 byte 来对齐,所以对象的大小为 8 的整数倍

保留内存

只能通过该对象访问的对象浅堆之和(其他对象可以访问到的排除掉)

举例:A,B,C,D,E 5个对象,A 引用 B,C。D 引用C、E

A 的深堆 = A + B + C

A 的保留内存大小 = A +B ,因为 D 引用了 C

例子

实战深堆、浅堆——学生访问网站记录

-XX:+HeapDumpBeforeFullGC -XX:HeapDumpPath=stu.hprof

WebPage 网站记录

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29package com.mousycoder.mycode.thinking_in_jvm;

/**

* @version 1.0

* @author: mousycoder

* @date: 2019-07-29 10:38

*/

public class WebPage {

private String url;

private String content;

public String getUrl() {

return url;

}

public void setUrl(String url) {

this.url = url;

}

public String getContent() {

return content;

}

public void setContent(String content) {

this.content = content;

}

}

Student

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55package com.mousycoder.mycode.thinking_in_jvm;

import java.util.List;

import java.util.Vector;

/**

* @version 1.0

* @author: mousycoder

* @date: 2019-07-29 10:37

*/

public class Student {

private int id;

private String name;

private List history = new Vector();

public void visit(WebPage webPage){

history.add(webPage);

}

public Student(int id, String name) {

this.id = id;

this.name = name;

}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public List getHistory() {

return history;

}

public void setHistory(List history) {

this.history = history;

}

}

TraceStudent

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49package com.mousycoder.mycode.thinking_in_jvm;

import java.util.List;

import java.util.Vector;

/**

* @version 1.0

* @author: mousycoder

* @date: 2019-07-29 10:39

*/

public class TraceStudent {

static List webPages = new Vector();

public static void createWebPages(){

for (int i = 0; i < 100; i++) {

WebPage wp = new WebPage();

wp.setUrl("http://www."+Integer.toString(i)+".com");

wp.setContent(Integer.toString(i));

webPages.add(wp);

}

}

public static void main(String[] args) {

createWebPages();

Student st3 = new Student(3,"billy");

Student st5 = new Student(5,"alice");

Student st7 = new Student(7,"taotao");

for (int i = 0; i < webPages.size(); i++) {

if (i % st3.getId() == 0) {

st3.visit(webPages.get(i)); // 访问能被id 整除的网站

}

if (i % st5.getId() == 0 ) {

st5.visit(webPages.get(i));

}

if (i % st7.getId() == 0) {

st7.visit(webPages.get(i));

}

}

webPages.clear();

System.gc();

}

}

用 MAT 打开stu.hprof 打开线程视图,可以看到每个student实例的 shallow heap 为 24 bytes (2 个 ref 引用 history + name = 4 byte * 2 = 8 byte ,1 个 int 类型 = 4 byte ,标记部分 8 byte ,一共 20 byte,向 8byte 靠齐就是 24 byte)

webpage 的深堆为 152 byte (80 + 48 + 24)

elementData 深堆大小为 96 byte (每个引用 4 个字节,合计 4*20=80 字节,数组对象头 8 个 字节,数组长度 4 个字节 ,合计 80 + 8 + 4 = 92 字节,向 8 字节对齐填充后,为 96 字节)

java 浅堆 深堆_【深入浅出-JVM】(57):深堆、浅堆相关推荐

  1. 直接内存与元空间_深入浅出 JVM 内存管理

    Java岗位面试,JVM是对程序员基本功考察,通常会问你对JVM了解吗? 可以分几部分回答这个问题,首先JVM内存划分 | JVM垃圾回收的含义 | 有哪些GC算法 以及年轻代和老年代各自特点等等.1 ...

  2. java heap最大最小参数_闲谈JVM(一):浅析JVM Heap参数配置

    文章目录 前言 JVM内存模型 堆(Heap)配置 Xms与InitialHeapSize Xmx与MaxHeapSize Heap的缺省配置 Default Heap Size Client JVM ...

  3. java数据段 静态区_回顾一下基础,关于栈与堆,常量池,静态区

    先来张简单的图: 1.jpg ------------------分割------------------------ 栈内存: 1.操作比较快速.但是为私有. 2.线程之间不共享.所以存放一些基本数 ...

  4. java 字节码增强原理_深入浅出Java探针技术1--基于java agent的字节码增强案例

    Java agent又叫做Java 探针,本文将从以下四个问题出发来深入浅出了解下Java agent 一.什么是java agent? Java agent是在JDK1.5引入的,是一种可以动态修改 ...

  5. java探针 字节码增强_深入浅出Java探针技术1--基于java agent的字节码增强案例

    Java agent又叫做Java 探针,本文将从以下四个问题出发来深入浅出了解下Java agent 一.什么是java agent? Java agent是在JDK1.5引入的,是一种可以动态修改 ...

  6. 大顶堆删除最大值_算法学习笔记(47): 二叉堆

    堆(Heap)是一类数据结构,它们拥有树状结构,且能够保证父节点比子节点大(或小).当根节点保存堆中最大值时,称为大根堆:反之,则称为小根堆. 二叉堆(Binary Heap)是最简单.常用的堆,是一 ...

  7. 堆晶结构_内蒙古苏尼特左旗地区堆晶角闪辉长岩的发现及地质意义

    内蒙古苏尼特左旗地区堆晶角闪辉长岩的发现及地质意义 李玉文 ; 邓晋福 [期刊名称] <现代地质> [年 ( 卷 ), 期] 1995(000)002 [摘要] 通过详细的野外工作和室内研 ...

  8. java犀牛是什么意思_深入浅出Rhino:Java与JS互操作

    2011年10月6日,一年一度的JavaOne大会隆重举行.JavaOne2011大会的主题之一介绍针对不同Java平台的产品路线图,这其中包括移动版(ME,Micro Edition).标准版(SE ...

  9. java单点登录跨域_深入浅出让你理解跨域与SSO单点登录原理与技术

    原标题:深入浅出让你理解跨域与SSO单点登录原理与技术 一:SSO体系结构 SSO SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互 ...

  10. java数组的clone方法_深入浅出,如何更彻底地理解Java数组的clone方法

    说在前面 在进入理解clone前,我们需要对"基本数据类型"和"引用数据类型"的存储模式有一个清晰的认识. 基本数据类型,变量的内容保存的是实际的值:引用数据类 ...

最新文章

  1. 你需要的不是重构,而是理清业务逻辑(转)
  2. asp操作excel,显示数据及统计方法
  3. kafka报错与调试技巧
  4. GitHub干货分享(APP引导页的高度集成 - DHGuidePageHUD)
  5. safari only css hack,css hack将Safari和Chrome同时作为目标单独使用
  6. android 多线程类,Android 多线程处理之多线程用法大集合
  7. PHPCMS2008调用Uchome系统[空间之星]GET语句
  8. monaco-editor浏览器中的网页代码编辑器在项目中集成
  9. 火星坐标-84坐标-百度地图坐标相互转换
  10. maxscale mysql 主从_MySQL高可用——MaxScale
  11. 一个关于容抗与感抗的实验
  12. 电脑网络里面的以太网不见了,开启后立即自动关闭,如何解决?
  13. TIM腾讯聊天(即时通信 IM)(咨询客服业务)
  14. 已经破解好的Quartus软件,license为什么会突然失效
  15. 火车头V9翻译插件-终极稳定版(翻译10000篇文章不报错)
  16. https:/问题解析remote: Total 10021 (delta 0), reused 0 (delta 0), pack-reused 10021 Receiving objects: 1
  17. C语言 switch语句
  18. puppy linux ssh,Blogs | 中文Puppy Linux开发者之家
  19. 基于微信小程序的中国各地美食推荐平台小程序
  20. 电脑桌面图标异常 计算机只显示C盘,电脑只有一个C盘怎么办?一招教你正确分区!...

热门文章

  1. 求知成瘾,却无作品 的思考 - stoneniqiu - 博客园
  2. 【转】Unix的文件系统的内部结构,主要是超级块、inode相关知识
  3. OSPF的基本配置介绍
  4. 「Leetcode」142.环形链表II:环找到了,那入口呢?
  5. Lightroom Classic 教程,如何在 Lightroom 中使用边界变形保留完整视图?
  6. indesign入门教程,如何旋转、翻转、锁定和隐藏内容?
  7. 多功能pdf编辑器PDF Office Max for mac
  8. Parallels Desktop 16 升级 macOS Big Sur 无法联网解决方法
  9. idea 配置 maven 和 镜像
  10. Hadoop生态圈-Flume的组件之自定义Sink