String s = "abc"堆栈中如何分配?

hxhnarkissos 2010-05-20 03:01:26
class AAA{
String s = "abc";
public void println(){
String s1 = "abc1";
System.out.println(s1);
}
}

请问下大家如果我new AAA();然后调用println();
内存中堆栈是如何分配的呢?
谁能给我解析下?
...全文
772 33 打赏 收藏 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
sxg263 2010-05-22
  • 打赏
  • 举报
回复
String a="hello"; 声明一个String类型的 变量,变量的值是hello
String a = new String("hello");是声明一个String类型的对象,对象的内容是hello

String a="hello"; a是放在内存常量区

String a = new String("hello");对象是放在内存堆空间里 ,引用放在栈空间,指向堆中的对象
huacong20082009 2010-05-22
  • 打赏
  • 举报
回复
编程思想里面的原话,你参考下 总结一下对象的创建过程。请考虑一个名为Dog的类:
(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章将要讲到的那样,这实际可能要求进行相当多的操作,特别是在涉及继承的时候。
蓝翔技校码农 2010-05-22
  • 打赏
  • 举报
回复
Java中,只要使用 new关键字来创建对象,则一定会(在堆区或栈区)创建一个新的对象。
gaoflydog 2010-05-22
  • 打赏
  • 举报
回复
13楼正解。
yzeaho 2010-05-22
  • 打赏
  • 举报
回复
国人的理解也就这样了,高深的要自己研究了,中国就是天下文章一大抄啊
eggno8 2010-05-21
  • 打赏
  • 举报
回复
来学习的,收藏此贴
fengweicheng_2008 2010-05-21
  • 打赏
  • 举报
回复
看了 回答的可以
hxhnarkissos 2010-05-21
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 liboofsc 的回复:]
为啥老有这样的问题,网上搜一下吧,一大堆。
[/Quote]

那你告诉下我 21楼(你楼上) 我问的问题 麻烦了
liboofsc 2010-05-21
  • 打赏
  • 举报
回复
为啥老有这样的问题,网上搜一下吧,一大堆。
hxhnarkissos 2010-05-21
  • 打赏
  • 举报
回复
JVM内存管理机制:
堆空间,永久存储区

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 buffers

Java heap (Xmx, Xms) 和java进程的heap为什么说是两回事?

JVM内存管理 与 JAVA内存分析 还有下面的 java进程的heap 和Java heap(Xmx,Xms)
他们之间谁包括谁?有何区别?
mp1034091594 2010-05-21
  • 打赏
  • 举报
回复

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: return

public 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


查下指令看看。
xiyoumax 2010-05-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wasaia 的回复:]

栈内存存放引用,也可存放基本变量(可这么理解)new关键字创建对象均在堆内存。方法在代码区,不调用,对象不存在。字符串字面值存放在常量池
[/Quote]
up
ch_jinyi 2010-05-21
  • 打赏
  • 举报
回复
上面说的很清楚了,呵呵
swjtu184041 2010-05-21
  • 打赏
  • 举报
回复
来学习 楼上几位说的让我茅塞顿开!
清峰 2010-05-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lu76689614 的回复:]
步骤:
1) 栈中开辟一块空间存放引用str1;
2) String池中开辟一块空间,存放String常量"abc";
3) 引用str1指向池中String常量"abc";
4) str1所指代的地址即常量"abc"所在地址,输出为true;

Java中,只要使用 new关键字来创建对象,则一定会(在堆区或栈区)创建一个新的对象。
[/Quote]

非常好
sxg263 2010-05-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lu76689614 的回复:]
步骤:
1) 栈中开辟一块空间存放引用str1;
2) String池中开辟一块空间,存放String常量"abc";
3) 引用str1指向池中String常量"abc";
4) str1所指代的地址即常量"abc"所在地址,输出为true;

Java中,只要使用 new关键字来创建对象,则一定会(在堆区或栈区)创建一个新的对象。
[/Quote]

正确
hh161151 2010-05-20
  • 打赏
  • 举报
回复
对于String s1 = "abc";
其中:
s1是在栈空间中。
abc是在数据区空间中。
对于String s2 = new String("def");
其中:
s2是在栈空间中。
def是在堆空间中
正如13楼的图所示。
hxhnarkissos 2010-05-20
  • 打赏
  • 举报
回复
Java heap (Xmx, Xms) 和java进程的heap是两回事情<BR>
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

这个怎么解释?
hxhnarkissos 2010-05-20
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 mars_ma_ok 的回复:]
我就发2张图片吧,很好理解:
[/Quote]

请问 这两张图片中的 heap 、stack 、date seg在JVM中么?
还是在JVM的"堆空间"中?
hxhnarkissos 2010-05-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 wasaia 的回复:]
应该是对空间。对象是能被动态回收的,新生区与养老区与java的垃圾回收有关,具体的google一下吧
[/Quote]

那就是说 我们刚才讨论的 String s = "abc" 只是在JVM中的"堆空间"中的"堆栈"里么?
加载更多回复(13)

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧