shallow

我到底需要多少内存(part 1)

徘徊边缘 提交于 2020-03-08 18:49:40
原文: http://plumbr.eu/blog/how-much-memory-what-is-retained-heap 我将需要多少内存?当你构建一个解决方案,创建一个数据结构或者选择一个算法时这个问题你可能问过自己或者别人.请问这个图是否适合在我的3G堆上,它包含1,000,000条边并且我使用HashMap存储它?我可以使用标准的集合API来构建我的自定义缓存解决方案或者他们带来的开销太大? 显然,回答这个简单的问题有点复杂.在这篇文章中我们将一窥全豹看这个坑到底有多深. 回答标题中的问题来自于几个部分.首先我们需要了解你是否对shallow heap和retained head的大小有兴趣. shallow heap比较容易 - 它仅仅是自己本身所占有的堆内存.如果计算它有一些细微差别,但是不在本文的范围内.敬请期待未来相同主题的文章. retained heap有许多计算方式更有趣.你不会对shallow heap感兴趣,在大多数情况下你的问题又可以说成"如果从内存中移除这个对象,通过垃圾回收会有多少内存被释放". 现在,我们都还记得,所有的Java垃圾回收算法都是以下的逻辑: 1. 有一些对象被GC认为是"重要的".被叫做GC root并且几乎不会被回收.比如,当前运行方法的本地变量和输入参数,程序线程,来自本地代码的引用和类似于"全局"的对象. 2. 任何从GC

Memory Analyzer tool(MAT)分析内存泄漏

不想你离开。 提交于 2019-12-03 11:41:05
实例分析参考 http://www.blogjava.net/rosen/archive/2010/06/13/323522.html http://eclipsesource.com/blogs/2013/01/21/10-tips-for-using-the-eclipse-memory-analyzer/ 一、首先理解几个概念 Shallow Heap Size 指对象自身所占用的内存大小,不包含其引用的对象所占的内存大小。 1、数组类型 数组元素对象所占内存的大小总和。 2、非数组类型 对象与它所有的成员变量大小的总和。当然这里面还会包括一些java语言特性的数据存储单元。 Retained Heap Size 前对象大小+当前对象可直接或间接引用到的对象的大小总和。 (间接引用的含义:A->B->C, C就是间接引用) 换句话说,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 这里不包括D对象,因为D对象被GC