java 浅堆 深堆_【深入浅出-JVM】(57):深堆、浅堆
概述
浅堆表示一个对象结构所占用的大小(对象头+实例数据+对齐填充,不包括内部引用 对象大小)
深堆表示一个对象被 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):深堆、浅堆相关推荐
- 直接内存与元空间_深入浅出 JVM 内存管理
Java岗位面试,JVM是对程序员基本功考察,通常会问你对JVM了解吗? 可以分几部分回答这个问题,首先JVM内存划分 | JVM垃圾回收的含义 | 有哪些GC算法 以及年轻代和老年代各自特点等等.1 ...
- java heap最大最小参数_闲谈JVM(一):浅析JVM Heap参数配置
文章目录 前言 JVM内存模型 堆(Heap)配置 Xms与InitialHeapSize Xmx与MaxHeapSize Heap的缺省配置 Default Heap Size Client JVM ...
- java数据段 静态区_回顾一下基础,关于栈与堆,常量池,静态区
先来张简单的图: 1.jpg ------------------分割------------------------ 栈内存: 1.操作比较快速.但是为私有. 2.线程之间不共享.所以存放一些基本数 ...
- java 字节码增强原理_深入浅出Java探针技术1--基于java agent的字节码增强案例
Java agent又叫做Java 探针,本文将从以下四个问题出发来深入浅出了解下Java agent 一.什么是java agent? Java agent是在JDK1.5引入的,是一种可以动态修改 ...
- java探针 字节码增强_深入浅出Java探针技术1--基于java agent的字节码增强案例
Java agent又叫做Java 探针,本文将从以下四个问题出发来深入浅出了解下Java agent 一.什么是java agent? Java agent是在JDK1.5引入的,是一种可以动态修改 ...
- 大顶堆删除最大值_算法学习笔记(47): 二叉堆
堆(Heap)是一类数据结构,它们拥有树状结构,且能够保证父节点比子节点大(或小).当根节点保存堆中最大值时,称为大根堆:反之,则称为小根堆. 二叉堆(Binary Heap)是最简单.常用的堆,是一 ...
- 堆晶结构_内蒙古苏尼特左旗地区堆晶角闪辉长岩的发现及地质意义
内蒙古苏尼特左旗地区堆晶角闪辉长岩的发现及地质意义 李玉文 ; 邓晋福 [期刊名称] <现代地质> [年 ( 卷 ), 期] 1995(000)002 [摘要] 通过详细的野外工作和室内研 ...
- java犀牛是什么意思_深入浅出Rhino:Java与JS互操作
2011年10月6日,一年一度的JavaOne大会隆重举行.JavaOne2011大会的主题之一介绍针对不同Java平台的产品路线图,这其中包括移动版(ME,Micro Edition).标准版(SE ...
- java单点登录跨域_深入浅出让你理解跨域与SSO单点登录原理与技术
原标题:深入浅出让你理解跨域与SSO单点登录原理与技术 一:SSO体系结构 SSO SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互 ...
- java数组的clone方法_深入浅出,如何更彻底地理解Java数组的clone方法
说在前面 在进入理解clone前,我们需要对"基本数据类型"和"引用数据类型"的存储模式有一个清晰的认识. 基本数据类型,变量的内容保存的是实际的值:引用数据类 ...
最新文章
- 你需要的不是重构,而是理清业务逻辑(转)
- asp操作excel,显示数据及统计方法
- kafka报错与调试技巧
- GitHub干货分享(APP引导页的高度集成 - DHGuidePageHUD)
- safari only css hack,css hack将Safari和Chrome同时作为目标单独使用
- android 多线程类,Android 多线程处理之多线程用法大集合
- PHPCMS2008调用Uchome系统[空间之星]GET语句
- monaco-editor浏览器中的网页代码编辑器在项目中集成
- 火星坐标-84坐标-百度地图坐标相互转换
- maxscale mysql 主从_MySQL高可用——MaxScale
- 一个关于容抗与感抗的实验
- 电脑网络里面的以太网不见了,开启后立即自动关闭,如何解决?
- TIM腾讯聊天(即时通信 IM)(咨询客服业务)
- 已经破解好的Quartus软件,license为什么会突然失效
- 火车头V9翻译插件-终极稳定版(翻译10000篇文章不报错)
- https:/问题解析remote: Total 10021 (delta 0), reused 0 (delta 0), pack-reused 10021 Receiving objects: 1
- C语言 switch语句
- puppy linux ssh,Blogs | 中文Puppy Linux开发者之家
- 基于微信小程序的中国各地美食推荐平台小程序
- 电脑桌面图标异常 计算机只显示C盘,电脑只有一个C盘怎么办?一招教你正确分区!...
热门文章
- 求知成瘾,却无作品 的思考 - stoneniqiu - 博客园
- 【转】Unix的文件系统的内部结构,主要是超级块、inode相关知识
- OSPF的基本配置介绍
- 「Leetcode」142.环形链表II:环找到了,那入口呢?
- Lightroom Classic 教程,如何在 Lightroom 中使用边界变形保留完整视图?
- indesign入门教程,如何旋转、翻转、锁定和隐藏内容?
- 多功能pdf编辑器PDF Office Max for mac
- Parallels Desktop 16 升级 macOS Big Sur 无法联网解决方法
- idea 配置 maven 和 镜像
- Hadoop生态圈-Flume的组件之自定义Sink