class AAA{
String s = "abc";
public void println(){
String s1 = "abc1";
System.out.println(s1);
}
}请问下大家如果我new AAA();然后调用println();
内存中堆栈是如何分配的呢?
谁能给我解析下?
String s = "abc";
public void println(){
String s1 = "abc1";
System.out.println(s1);
}
}请问下大家如果我new AAA();然后调用println();
内存中堆栈是如何分配的呢?
谁能给我解析下?
1) 栈中开辟一块空间存放引用str1;
2) String池中开辟一块空间,存放String常量"abc";
3) 引用str1指向池中String常量"abc";
4) str1所指代的地址即常量"abc"所在地址,输出为true; Java中,只要使用 new关键字来创建对象,则一定会(在堆区或栈区)创建一个新的对象。
a在栈区
new AAA()实体在堆中,
这个实体内的的s,s1 引用都在堆里。凡是在堆里的对象,对象内无论是值类型还是引用类型都在堆里。s,s1变量实体在常量堆里,AAA对外暴漏一个操作接口就是那个打印方法。
那假如我只是
String a = "aaa";
这个过程JVM是如何操作的呢?
那常量池在堆中还是栈中呢?
JVM中除了堆、栈、方法区域还有什么呢?
永久存储区(Permanent Space)
和堆空间(The Heap Space)。
其中堆空间又分为新生区(Young (New) generation space)
和养老区(Tenure (Old) generation space)那 刚才我问的“堆栈”是在 永久存储区呢 还是堆空间呢?
那就是说 我们刚才讨论的 String s = "abc" 只是在JVM中的"堆空间"中的"堆栈"里么?
请问 这两张图片中的 heap 、stack 、date seg在JVM中么?
还是在JVM的"堆空间"中?
java进程的heap包含:<BR>
Java Heap<BR>
Permanent Generation<BR>
Thread stacks<BR>
Native code<BR>
Directly allocated memory<BR>
Code generation<BR>
Garbage collection<BR>
TCP buffers这个怎么解释?
其中:
s1是在栈空间中。
abc是在数据区空间中。
对于String s2 = new String("def");
其中:
s2是在栈空间中。
def是在堆空间中
正如13楼的图所示。
堆空间,永久存储区JAVA内存分析:
寄存器
堆栈(stack)
堆(heap)
静态存储
常量存储
非RAM存储Java heap (Xmx, Xms) 和java进程的heap是两回事情
java进程的heap包含:
Java Heap
Permanent Generation
Thread stacks
Native code
Directly allocated memory
Code generation
Garbage collection
TCP buffersJava heap (Xmx, Xms) 和java进程的heap为什么说是两回事?JVM内存管理 与 JAVA内存分析 还有下面的 java进程的heap 和Java heap(Xmx,Xms)
他们之间谁包括谁?有何区别?
public A();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: aload_0
5: ldc #2; //String abc
7: putfield #3; //Field s:Ljava/lang/String;
10: returnpublic void println();
Code:
0: ldc #4; //String abc1
2: astore_1
3: getstatic #5; //Field java/lang/System.out:Ljava/io/PrintStream;
6: aload_1
7: invokevirtual #6; //Method java/io/PrintStream.println:(Ljava/lang/St
ing;)V
10: return
查下指令看看。
String a = new String("hello");是声明一个String类型的对象,对象的内容是helloString a="hello"; a是放在内存常量区String a = new String("hello");对象是放在内存堆空间里 ,引用放在栈空间,指向堆中的对象
(1) 类型为Dog的一个对象首次创建时,或者Dog类的static方法/static字段首次访问时,Java解释器必须找到Dog.class(在事先设好的类路径里搜索)。
(2) 找到Dog.class后(它会创建一个Class对象,这将在后面学到),它的所有static初始化模块都会运行。因此,static初始化仅发生一次——在Class对象首次载入的时候。
(3) 创建一个new Dog()时,Dog对象的构建进程首先会在内存堆(Heap)里为一个Dog对象分配足够多的存储空间。
(4) 这种存储空间会清为零,将Dog中的所有基本类型设为它们的默认值(零用于数字,以及boolean和char的等价设定)。
(5) 进行字段定义时发生的所有初始化都会执行。
(6) 执行构建器。正如第6章将要讲到的那样,这实际可能要求进行相当多的操作,特别是在涉及继承的时候。