1.不清楚 2.肯定开辟了内存,你想new之后,肯定会返回一个引用,所以肯定需要为这个引用在占内存分配空间。 至于在堆中开没开辟内存,可以看下面这个例子。 public class Test { public static void main(String[] args) { int a[] = new int[0]; if ( a == null) { System.out.println("null"); } }
Java没有提供现成的函数去计算对象的内存空间,不过可以用大量产生某个对象然后计算平均值的方法近似获得该对象占用的内存。写个例子给你:public class Test{ long f1 = Runtime.getRuntime().freeMemory(); for(int i=0;i<1000;i++) { MyObject t = new MyObject(); } long f2 = Runtime.getRuntime().freeMemory(); System.out.println((f1-f2)/1000);//输出每个对象占用的字节数 } }答案补充 怎么会没有意义呢?比如说开发一个自动化测试工具,需要分析代码的内存效率。答案补充 关于用序列化来计算对象的内存大小,很多人都以为这种方法可行,但其实不行。1. jvm的字符编码是Unicode(16位),而序列化输出的文本是ANSI或UTF-8编码(8位),所以这在对象大小的比较上就产生了很大的差别。2. 序列化的结果是以文本的形式记录一个对象的状态,文本是不具有java里面的丰富的类型的,比如说int、long等等,这在内存大小上就会产生重大的差别。比如说一个int,在内存里总是4个字节,而保存到文本后就不一定了,这个数字越大占用的空间就越大(需要更加多的文本字符去记录它)。关于这点你可以自己做个测试,将10000个1序列化和将10000个1000序列化,看看大小相差多少。
2.肯定有。
3.不一定。如果有exception那自然最好用try catch 。。如果没有,那么try不会捕捉到异常,程序流程继续。
4.先由B的try catch进行处理,如果没有被B捕捉到,throw给A进行处理,A也没处理到就抛给调用A的程序 比如main
不一定需要catch语句库
2.肯定开辟了内存,你想new之后,肯定会返回一个引用,所以肯定需要为这个引用在占内存分配空间。
至于在堆中开没开辟内存,可以看下面这个例子。
public class Test { public static void main(String[] args) {
int a[] = new int[0];
if ( a == null) {
System.out.println("null");
}
}
}
结果没有输出null.说明a是有指向的,指向的当然该对象堆内存中的地址了(你可以先这么理解,实际上引用的实现Java并没有强行规定,不同虚拟机可以选择不同的实现方式)。3.不一定4.这个要看情况而定,也有可能两个人都不处理。如果b中抛出的异常,自己已经捕获了,那么就在b中处理了。
如果b中抛出的异常自己不能捕获,就交到上一层处理,也就是a中。如果a能捕获,就在a中处理了。如果a中还不能捕获就交给上一层。main函数,如果还不能处理,就交给虚拟机。你只要知道,他是一层一层往上抛的就行。原理就是本层能处理就处理,不能处理就交给上一层处理。
你看下对你有木有帮助。
long f1 = Runtime.getRuntime().freeMemory();
for(int i=0;i<1000;i++)
{
MyObject t = new MyObject(); }
long f2 = Runtime.getRuntime().freeMemory();
System.out.println((f1-f2)/1000);//输出每个对象占用的字节数 } }答案补充
怎么会没有意义呢?比如说开发一个自动化测试工具,需要分析代码的内存效率。答案补充
关于用序列化来计算对象的内存大小,很多人都以为这种方法可行,但其实不行。1. jvm的字符编码是Unicode(16位),而序列化输出的文本是ANSI或UTF-8编码(8位),所以这在对象大小的比较上就产生了很大的差别。2. 序列化的结果是以文本的形式记录一个对象的状态,文本是不具有java里面的丰富的类型的,比如说int、long等等,这在内存大小上就会产生重大的差别。比如说一个int,在内存里总是4个字节,而保存到文本后就不一定了,这个数字越大占用的空间就越大(需要更加多的文本字符去记录它)。关于这点你可以自己做个测试,将10000个1序列化和将10000个1000序列化,看看大小相差多少。