java 堆问题分析(未完)

一 shallow heap 和 retained heap的区别

1 shallow size

是对象本身占据的内存的大小,不包含其引用的对象。对于常规对象(非数组)的shadow size由其成员变量的数量和类型来定,而数组的shallow size则是数组元素大小的总和。

2 retained size

Retained Size=当前对象大小 + 当前对象可直接或间接引用到的对象的大小总和。(间接引用的含义:A->B->C,C就是间接引用) ,并且排除被GC Roots直接或者间接引用的对象

换句话说,Retained Size就是当前对象被GC后,从Heap上总共能释放掉的内存。 
不过,释放的时候还要排除被GC Roots直接或间接引用的对象。他们暂时不会被被当做Garbage。 

GC Roots直接引用了A和B两个对象。

A对象的Retained Size=A对象的Shallow Size 
B对象的Retained Size=B对象的Shallow Size + C对象的Shallow Size

栗子??

上图中obj1的retained size为obj1、obj2、obj4的shallow size总和,并不包括obj3的shallow size,因为obj3被Gc Roots引用了,也就是说obj3除了被obj2引用,还有其他外部引用。

上图中obj1的retained size为obj1、obj2、obj3、obj4的shallow size总和,因为obj3除了被obj2引用,没有其他外部引用。

摘自: http://blog.csdn.net/a740169405/article/details/53610689

时间: 2024-11-24 23:43:06

java 堆问题分析(未完)的相关文章

Java基本概念(未完)

仅简单总结~辅助快速回忆~ 一.JVM 1,Java类加载机制 Java程序由多个类文件组成,按需加载. Java的动态扩展是由运行期动态加载和动态链接实现的.——动态绑定,多态. 加载步骤: 1)装载:查找和导入Class文件. a) 根据一个类的全限定名来获取二进制字节流 b) 将这个字节流代表的静态存储结构转化为方法区的运行时数据结构. c)在Java堆中生成一个代表这个类的Class对象,作为方法区数据的访问入口. 2)链接:把类的二进制数据合并到JRE中. a) 校验:检查Class文

[Java]多线程复习(更新未完)

知识点小结:(具体看例子) 多线程: 线程是程序中单独创建的控制单元,是并发执行的程序.外部顺序执行的程序叫做主线程. 线程是多任务操作系统调用CPU来回切换的程序. 注意:线程开启要用start方法,虚拟机调用底层向操作系统申请一个单独线程.如果你只执行run方法, 那么并没有开启一个线程,仅仅是一个普通类的方法,那么是在主线程中顺序执行的.你开启start是虚 拟机新开启一个线程后自动去调用run方法的. Windows执行虚拟机,虚拟机执行多线程程序,多线程程序调用底层Windows,最终

Java开发记事本(未完待续)

右键菜单图 打印图 设置背景颜色.字体样式.字体颜色图 主要 package com.sxt.nodepad.view; import java.awt.BorderLayout; public class NotepadMainFrame extends JFrame implements ActionListener{ /** * 序列号 */ private static final long serialVersionUID = 8585210209467333480L; private

SpaceSyntax【空间句法】之DepthMapX学习:第四篇 凸多边形图分析[未完]

这一篇正式讲解分析类型中的第一个,凸多边形分析,流程图参照上一篇的. 博客园/B站/知乎/CSDN @秋意正寒(我觉得这一篇肯定很多盗图的,那么我在版头加个本篇地址吧) https://www.cnblogs.com/onsummer/p/10793858.html 目录:https://www.cnblogs.com/onsummer/p/10777520.html 1. CAD/GIS软件/或其他矢量编辑软件 绘制好凸多边形图数据 我直接给截图了,不会画的同学可以私信找我要. 2. 导入数据

源码分析:Java堆的创建

虚拟机在内存中申请一片区域,由虚拟机自动管理,用来满足应用程序对象分配的空间需求,即堆空间. 由于程序运行的局部特性,程序创建的大多数对象都具有非常短的生命周期,而程序也会创建一些生命周期特别长的对象.简单的复制收集器无论对象的 生命周期是长是短,都会进行复制操作.而生命周期较长的对象在多次垃圾回收期间内并不会被回收,这就使得这些对象被来回复制而使得算法性能大大下降. 分代收集把堆分为多个子堆,分别用来存放不同寿命的对象.新生对象空间的将经历最频繁的垃圾回收,而对于经历了若干次垃圾收集后仍然存活

细菌觅食优化算法:理论基础,分析,以及应用(未完)

原作者:Swagatam Das,Arijit Biswas,Sambarta Dasgupta,和Ajith Abraham  [摘 要]细菌觅食优化算法(Bacterial foraging optimization algorithm[BFOA])已经被分布式优化和控制的同行们当作一种全局性的优化算法接受.BFOA是由大肠杆菌的群体觅食行为所启发而总结出来 的.BFOA已经吸引了足够多的研究者的注意,由于它出现在解决真实世界中一些应用领域上优化问题的高效性.E.coli 的群体策略的生物基

《Linux内核分析》MOOC课程之从迷你Linux内核角度理解进程时间轮片调度(未完)

代码分析 mypcb.h mymain.c 上面这段代码主要完成了对0号进程的初始化,即pid置为0,状态state置为0(即runnable状态),进程入口及当前进程的线程的ip指向my_process,线程的sp指向当前进程的进程堆栈,由于目前只有0号进程,所以next指针指向自己形成一个单PCB链表. 上面这段代码主要是扩充循环链表,使用memcpy()复制0号进程的状态给创建的从1号到MAX_TASK_NUM-1号进程,并与0号进程一起构成一个循环PCB链表. 上面这段代码功能是从循环P

google-perftools 分析JAVA 堆外内存

google-perftools 分析JAVA 堆外内存 分类: j2se2011-08-25 21:48 3358人阅读 评论(4) 收藏 举报 javahbasehtml工具os 原文转自:http://koven2049.iteye.com/blog/1142768,所有权利归原作者所有 最近线上运行的hbase发现分配了16g内存,但是实际使用了22g,堆外内存达到6g.感觉非常诡异.堆外内存用一般的工具很难查看,可以通过google-perftools来跟踪: http://code.

我的Java问题集(1)(重点、难点、疑点)未完待续...

学习Java这么久了,总算也了点笔记,一个一个字码的哟! 1.Java中的int等类型变量既然已经有默认值为0,为什么还会出现没有初始化,编译出错呢? 一个变量作为类成员使用的时候,如果没有被初始化,java会为其分配默认值: Boolean false Char '\u0000'(null) byte (byte)0 short (short)0 int 0 long 0L float 0.0f double 0.0d 如果在一个方法中定义一个变量,java不会给其分配默认值,就必须我们来给他