[Android Memory] Shallow Heap大小计算释疑

简介:

转载自:http://blog.csdn.net/sodino/article/details/24186907

查看Mat文档时里面是这么描述Shallow Heap的:Shallow heap is the memory consumed by one object. An object needs 32 or 64 bits (depending on the OS architecture) per reference, 4 bytes per Integer, 8 bytes per Long, etc. Depending on the heap dump format, the size may be adjusted (e.g. aligned to 8, etc...) to model better the real consumption of the VM.

翻译过来: shallow heap是一个对象的内存消耗,依据os系统架构,一个对象可能需要4个字节或者8个字节。integer 类型消耗 4个字节, Long消耗 8个字节。由于heap dump的格式,分配的大小会比实际vm消耗的要大一些。

照这么说,在Android机子上,每个Object的Shallow Heap开销应该是8 bytes 再加上该对象每个内部成员变量的内存开销。

   Class Demo0 {}
 
   Class Demo1 {
       int int_num = 0;
   }

以上面两个类为例,Demo0的对象Shallow Heap大小应该是8 bytes,那么Demo1的Shallow Heap大小应该是8 + 4 = 12 bytes。但MAT的结果却显示值为16 bytes,如下图:

 

                                                              图1. Demo1 Shallow Heap值显示
 为了解决以上疑问,继续在类里面添加成员变量观察Shallow Heap的显示大小。
复制代码
   Class Demo12 {
       int int_num = 0;
       int int_num1 = 0;
   }
 
   Class Demo13 {
       int int_num = 0;
       int int_num1 = 0;
       int int_num2 = 0;
   }
复制代码

上面这两个类的对象中,Shallow Heap 对应的大小如图2所示分别为

Demo12 : 16 bytes;

Demo13: 24 bytes;

                                                                                      图2.

至此,就由不得猜想JVM在分配内存时是以8 bytes为粒度进行分配的了。

Google一下得文章:Java对象内存结构,英文版Java Objects Memory Structure

由此猜想得到验证。

由于对象是以8 bytes为粒度进行分配的,所以Demo1仅仅用去一个4 bytes的int,仍空余着另外的4 bytes,这空余的4 bytes可以再声明第2个int成员变量变成Demo12。如果要再声明第3个int成员变量时,需要再另外分配出8 bytes的空间,即变为24bytes的Demo13了。

 

   由此问题发现,VM为一个对象所分配的空间,并不一定是当前这个对象中成员变量所占内存的大小和,极可能是偏大的。

 

   另附各种数据类型所需的字节数如下表。

类型

bytes

long

8

int

4

short

2

char

2

boolean

1

byte

1

ref(引用)

4

 

分类:  Android Memory
本文转自demoblog博客园博客,原文链接http://www.cnblogs.com/0616--ataozhijia/p/3913317.html如需转载请自行联系原作者

demoblog
相关文章
|
Java Android开发 开发者
Android Studio Profiler Memory (内存分析工具)的简单使用及问题分析
Android Studio Profiler Memory (内存分析工具)的简单使用及问题分析
2866 0
Android Studio Profiler Memory (内存分析工具)的简单使用及问题分析
|
存储 编解码 Java
【Android FFMPEG 开发】FFMPEG 音频重采样 ( 初始化音频重采样上下文 SwrContext | 计算音频延迟 | 计算输出样本个数 | 音频重采样 swr_convert )(一)
【Android FFMPEG 开发】FFMPEG 音频重采样 ( 初始化音频重采样上下文 SwrContext | 计算音频延迟 | 计算输出样本个数 | 音频重采样 swr_convert )(一)
739 0
|
编解码 文件存储 Android开发
Android | 如何计算图片占用内存的大小
Android | 如何计算图片占用内存的大小
Android | 如何计算图片占用内存的大小
|
并行计算 算法 Java
RenderScript 让你的Android计算速度快的飞上天!
RenderScript 让你的Android计算速度快的飞上天!
RenderScript 让你的Android计算速度快的飞上天!
|
Android开发 开发者
Android系统是如何计算应用启动耗时的?能否更精准定位性能瓶颈呢?
Android系统是如何计算应用启动耗时的?能否更精准定位性能瓶颈呢?
Android系统是如何计算应用启动耗时的?能否更精准定位性能瓶颈呢?
|
Android开发 Kotlin
【错误记录】Android Studio 运行报错 ( There is not enough memory to perform the requested operation. )
【错误记录】Android Studio 运行报错 ( There is not enough memory to perform the requested operation. )
684 0
【错误记录】Android Studio 运行报错 ( There is not enough memory to perform the requested operation. )
|
缓存 Android开发
【Android 进程保活】Low Memory Killer 机制
【Android 进程保活】Low Memory Killer 机制
422 0
【Android 进程保活】Low Memory Killer 机制
|
API Android开发
【Android 内存优化】自定义组件长图组件 ( 长图滚动区域解码 | 手势识别 GestureDetector | 滑动计算类 Scroller | 代码示例 )
【Android 内存优化】自定义组件长图组件 ( 长图滚动区域解码 | 手势识别 GestureDetector | 滑动计算类 Scroller | 代码示例 )
155 0
【Android 内存优化】自定义组件长图组件 ( 长图滚动区域解码 | 手势识别 GestureDetector | 滑动计算类 Scroller | 代码示例 )
|
API Android开发
【Android 内存优化】自定义组件长图组件 ( 获取图像宽高 | 计算解码区域 | 设置图像解码属性 复用 像素格式 | 图像绘制 )
【Android 内存优化】自定义组件长图组件 ( 获取图像宽高 | 计算解码区域 | 设置图像解码属性 复用 像素格式 | 图像绘制 )
170 0
【Android 内存优化】自定义组件长图组件 ( 获取图像宽高 | 计算解码区域 | 设置图像解码属性 复用 像素格式 | 图像绘制 )
|
Android开发
【Android 内存优化】使用 Memory Analyzer ( MAT ) 工具分析内存 ( hprof 文件转换 | MAT 工具下载 | MAT 工具使用 )(二)
【Android 内存优化】使用 Memory Analyzer ( MAT ) 工具分析内存 ( hprof 文件转换 | MAT 工具下载 | MAT 工具使用 )(二)
299 0
【Android 内存优化】使用 Memory Analyzer ( MAT ) 工具分析内存 ( hprof 文件转换 | MAT 工具下载 | MAT 工具使用 )(二)
下一篇
无影云桌面