java 关键字 sizeof_Java 基本数据类型 sizeof 功能
這是一個(gè)程序,java中沒有現(xiàn)成的sizeof的實(shí)現(xiàn),原因主要是java中的基本數(shù)據(jù)類型的大小都是固定的,所以看上去沒有必要用sizeof這個(gè)關(guān)鍵字。
實(shí)現(xiàn)的想法是這樣的:java.lang.Runtime類中有一些簡單的能涉及到內(nèi)存管理的函數(shù):
Every Java application has a single instance of class?Runtime?that allows the application to interface with the environment in which the application is running. The current runtime can be obtained from the?getRuntime?method.long
void
long
void
使用這些簡單的內(nèi)存訪問,可以得到內(nèi)存的一些情況,我們通過建立一個(gè)大的某個(gè)類的數(shù)組,來查看內(nèi)存用了多少,進(jìn)而可以求得類的大小。
源碼:
private static void calSize2() {
runGC();
long heap1 = 0;
final int count = 100000;
Object[] objs = new Object[count];
for(int i=-1; i
Object obj = null;
obj = new Object();// 8
//obj = new Integer( i );// 16
//obj = new Short( (short)i );// 16
//obj = new Long( i );// 16
//obj = new Byte( (byte)0 );// 16
//obj = new Character( (char)i );// 16
//obj = new Float( i );// 16
//obj = new Double( i );// 16
//obj = new Boolean( true );// 16
//obj = new String();// 40
if(i<0){
obj = null;
runGC();
heap1 = usedMemory();// before memory size
} else {
objs[i] = obj;
}
}
runGC();
long heap2 = usedMemory();// after memory size
final int size = (int)Math.round( (heap2 - heap1)/(double)count );
System.out.println("heap1 = " + heap1 + "; heap2 = " + heap2);
System.out.println("heap2-heap1 = " + (heap2 - heap1) + "; " + objs[0].getClass().getSimpleName() + " size = " + size);
for(int i=0; i
objs[i] = null;
}
objs = null;
runGC();
}
private static void runGC() {
for(int i=0; i<4; i++) {
long usedMem1 = usedMemory();
long usedMem2 = Long.MAX_VALUE;
for(int j=0; (usedMem1
rTime.runFinalization();
rTime.gc();
Thread.yield();
usedMem2 = usedMem1;
usedMem1 = usedMemory();
}
}
}
private static long usedMemory() {
return rTime.totalMemory() - rTime.freeMemory();
}
注意:Object[] objects = new Object[count];
只是分配了數(shù)組空間,沒有分配對象的空間。數(shù)組中只有引用而已。
結(jié)論:下代碼測試基本對象時(shí),得出的結(jié)果象下面:
Object obj = null;
obj = new Object();// 8
obj = new Integer( i );// 16
obj = new Short( (short)i );// 16
obj = new Long( i );// 16
obj = new Byte( (byte)0 );// 16
obj = new Character( (char)i );// 16
obj = new Float( i );// 16
obj = new Double( i );// 16
obj = new Boolean( true );// 16
obj = new String();// 40
怎么會這樣呢???解釋如下:
這個(gè)例子寫的很好,正好說明了java中基本類型封裝對象所占內(nèi)存的大小.
1.簡單的Object對象要占用8個(gè)字節(jié)的內(nèi)存空間,因?yàn)槊總€(gè)實(shí)例都至少必須包含一些最基本操作,比如:wait()/notify(),equals(), ? hashCode()等
2.使用Integer對象占用了16個(gè)字節(jié),而int占用4個(gè)字節(jié),說了封裝了之后內(nèi)存消耗大了4倍
3.那么Long看起來比Integer對象應(yīng)該使用更多空間,結(jié)果Long所占的空間也是16個(gè)字節(jié).
那么就正好說明了JVM的對于基本類型封裝對象的內(nèi)存分配的規(guī)則是如下:
Object所占內(nèi)存(8個(gè)字節(jié))+最大基本類型(long)所占內(nèi)存(8個(gè)字節(jié)) ? = ? 16字節(jié).
JVM強(qiáng)制使用8個(gè)字節(jié)作為邊界.
所以所有基本類型封裝對象所占內(nèi)存的大小都是16字節(jié).
但是還是有區(qū)別,比如:
Integer對象雖然占用了16個(gè)字節(jié)的內(nèi)存,但是只是利用了 Object所占內(nèi)存(8個(gè)字節(jié))+int所占內(nèi)存(4個(gè)字節(jié)) ? = ? 12字節(jié).
還有4個(gè)字節(jié)根本沒有被使用.呵呵,仔細(xì)分析了一晚,還是有很多收獲的
總結(jié)
以上是生活随笔為你收集整理的java 关键字 sizeof_Java 基本数据类型 sizeof 功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 批量读取xlsx并合并_p
- 下一篇: 什么是java dom_java web