使用计算总内存大小的方法确定jvm中为对象分配的存储空间大小
来源:互联网 发布:电信运营商数据 编辑:程序博客网 时间:2024/04/30 09:56
最近发现产品的java程序,占用内存变大很多。由于是从之前的32位server转到使用64位server,所以很有可能是不同架构下jvm分配内存大小不同导致的。
JAVA中没有类似C语言的sizeof函数,所以要确定jvm为基本类型或特定对象分配的内存大小,看起来比较困难。
下面的代码通过新建大量Object计算内存总大小的方式,来确定为每个对象分配的内存大小。
public class Sizeof{public static void main (String [] args) throws Exception{testMem(1);testMem(2);testMem(3);} private static void testMem (int index) throws Exception { // Warm up all classes/methods we will use runGC (); usedMemory (); // Array to keep strong references to allocated objects final int count = 100000; Object [] objects = new Object [count]; long heap1 = 0; // Allocate count+1 objects, discard the first oneString testObj="";int x = 1;long y = 1;String z = ""; for (int i = -1; i < count; ++ i) { Object object = null; // Instantiate your data here and assign it to object object = new Object ();switch (index) {case 1: object = new Integer (x);testObj="Integer"; break;case 2: object = new Long (y);testObj="Long"; break;case 3: object = new String (z);testObj="String"; break; } if (i >= 0) objects [i] = object; else { object = null; // Discard the warm up object runGC (); heap1 = usedMemory (); // Take a before heap snapshot } } runGC (); long heap2 = usedMemory (); // Take an after heap snapshot: final int size = Math.round (((float)(heap2 - heap1))/count); //System.out.println ("'before' heap: " + heap1 + ", 'after' heap: " + heap2); //System.out.println ("heap delta: " + (heap2 - heap1) + ", {" + objects [0].getClass () + "} size = " + size + " bytes");System.out.println(testObj + " size=" + size + " bytes"); for (int i = 0; i < count; ++ i) objects [i] = null; objects = null; } private static void runGC () throws Exception { // It helps to call Runtime.gc() // using several method calls: for (int r = 0; r < 4; ++ r) _runGC (); } private static void _runGC () throws Exception { long usedMem1 = usedMemory (), usedMem2 = Long.MAX_VALUE; for (int i = 0; (usedMem1 < usedMem2) && (i < 500); ++ i) { s_runtime.runFinalization (); s_runtime.gc (); Thread.currentThread ().yield (); usedMem2 = usedMem1; usedMem1 = usedMemory (); } } private static long usedMemory () { return s_runtime.totalMemory () - s_runtime.freeMemory (); } private static final Runtime s_runtime = Runtime.getRuntime ();} // End of class
分别在32位和64位server上编译执行上面的程序,得到的结果:
32位server
Integer size=16 bytes
Long size=16 bytes
String size=24 bytes
64位server
Integer size=24 bytes
Long size=24 bytes
String size=40 bytes
可见,同样的class文件在不同架构的jvm执行下,会占用不同大小的内存空间。看来64位的系统也不一定好。。。
- 使用计算总内存大小的方法确定jvm中为对象分配的存储空间大小
- 查看tomcat为jvm分配的内存大小
- 关于JVM中堆内存大小的分配问题
- iOS获取文件夹中存储空间的大小、手机剩余空间大小、手机总空间大小 工具
- 为结构体分配额外存储空间的方法
- ICCAVR 中存储空间的分配
- sizeof计算栈中分配的大小
- 计算占用内存大小的方法
- Tomcat 应用中JVM使用内存大小的调整。
- 聊聊JVM(三)两种计算Java对象大小的方法
- DSP的存储空间分配
- 6410的存储空间分配
- 更改eclipse中JVM的内存大小
- 修改Tomcat使用的JVM内存大小
- 修改Tomcat使用的JVM内存大小
- 对于结构体对象在内存中分配地址的顺序及其占内存大小的疑问
- java中计算对象内存大小
- 确定使用回滚段的大小
- 加入域的时候提示拒绝访问|活动目录域加入域权限委派
- 经常被vs2008的xx.aspx.designer.cs与界面不同步的问题烦恼
- P欺诈,使用Winpcap对数据包进行拦截
- HDU1394用线段树求逆序数
- 工作中的不顺心
- 使用计算总内存大小的方法确定jvm中为对象分配的存储空间大小
- HDU1671用指针实现的字典树
- asp.net mvc3 css/js压缩合并---持续更新
- zend framework modules
- asp.net下载文件几种方式
- eclipse alt+/ Content Assist问题
- HDU1787欧拉公式之在线算法
- ArrayList
- The OAuth 2.0 Authorization Protocol (第一章,基础概念)