哦?jvm spec上是这么说的:3.5.3 Heap The Java virtual machine has a heap that is shared among all Java virtual machine threads. The heap is the runtime data area from which memory for all class instances and arrays is allocated.
我指实现,jvm和jvm规范还是有差别的。
此heap非彼heap,从jvm实现的角度讲heap是个整体,由于绝大多数jvm都是由c,c++实现的,c简单的把内存分为了栈和堆,上面的heap我觉得应该是指jvm实现中的heap,而这个heap包括了java程序中常说的方法区和堆内存,不然String s = new String("abc"),创建了两个对象,怎么解释?明显一个abc是放在方法区的常量池中。不知道我这么理解是否正确?
首先是4个java.lang.Class对象:分别是[I和[[I,还有java.lang.Object.class,java.io.Serializable.class这4个Class对象应该肯定有,可能还有遗漏之处------------
然后是一个二维数组对象
然后是三个一维数组对象关于数组在内存中该以何种数据结构来表示,翻看了一下java语言规范和java虚拟机规范,没有找到相应的说明
这4个数组对象是臆断
---------------
int[][] scores={{3,2,5,8},{2,9},{3,4}}
scores.getClass()这个方法能返回一个Class对象,就是[[I
scores[0].getClass()这个方法返回的Class对象是[I的实例
数组是可序列化的,肯定实现了java.io.Serializable接口,在连接[[I和[I对象的时候,会装载java.io.Serializable接口,导致创建一个Serializable.class,同时,数组肯定继承了java.lang.Object,虚拟机必须装载Object,会创建Object.class不过这个Object.class应该在加载这条语句的类的时候已经创建了,可以不算这条语句创建的
如果这条语句所在的类实现了java.io.Serializable接口,Serializable.class也可以不算这条语句创建的
int[][] scores=new int[3][];
scores2[0]=new int[]{3,2,5,8};
scores2[1]=new int[]{2,9};
scores2[2]=new int[]{3,4};
。
int[][] scores2=new int[3][];
scores2[0]=new int[]{3,2,5,8};
scores2[1]=new int[]{2,9};
scores2[2]=new int[]{3,4};
赋值号右面的,是一个常量表达式。
常量表达式,不占用内存空间。(不要矫情,就认为它不占用)你说 int n = 50; 这个语句。
左边是声明,右边是常量。这样理解,不是很简单吗 ?作为一个常量表达式而言,你用操心他有多少[]{}这些符号吗,它最终只是一个常量。
比如:
String s = "把复杂的事情变简单了,聪明~!";
//你说创建了几个对象?难道字符也算在内 ?常量就是常量,关键看左面。
boolean b = 3+5>4 ? true : 1+3>2 ;
//你说创建了几个对象 ?3+5>4 也是对象? true也是对象? 常量就是常量。
3,2,5,8,9,4,{3,2,5,8},{2,9},{3,4},{{3,2,5,8},{2,9},{3,4}}
共10个
The Java virtual machine has a heap that is shared among all Java virtual machine threads. The heap is the runtime data area from which memory for all class instances and arrays is allocated.