堆中对象实例都放了什么东西?

adfhjk 2012-07-25 03:46:19
最近看了一下java虚拟机,有些地方不太懂,请教一下

public class AS {
String a="a";
String b="b";
String c;
public AS(){}

public void SetC(String c){
this.c=c;
}
}


1.变量a和b的值是在AS.class被加载的时候存放到了constant_string_info表里了吗?
2.比如在main方法里new了一个AS as=new AS(); String e="qwe"; as.setC(e);
方法区里面是每一个类都有一个常量池吗,每个常量池都有一个constant_string_info表?如果是的话,那么e="qwe"是在哪个常量池检索是否存在“qwe”,是main所在类的常量池吗?
new AS后产生了一个AS对象实例放在了堆中。那么堆中的对象实例都包括哪些内容,是仅仅包括实例的描述,还是包括实例的特有的数据(如果包括,那是值,还是值的引用)?具体的,例如as中c,其值为“qwe”,那么在这个heap中的实例数据包括这个c的值吗,还是指向某个常量池中“qwe”的引用?
...全文
389 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
adfhjk 2012-07-29
  • 打赏
  • 举报
回复
还没完全明白呀。。。TT
五哥 2012-07-26
  • 打赏
  • 举报
回复
放对象的属性,基本类型就直接放置,引用类型放 引用的地址
zhangyong369 2012-07-26
  • 打赏
  • 举报
回复
String e="qwe"; 是先在常量池中找看有没有,有则直接指向
如没有 则需要创建的?
我是这样理解不知对不?
Mathore 2012-07-26
  • 打赏
  • 举报
回复
可以这么理解,常量池中有CONSTANT_Integer_info,CONSTANT_Float_info和CONSTANT_String_info等等。。这个可以去查。所有的常量都放这里面,而且只有一份。对象使用引用来获取值。
具体可以查常量池技术。
adfhjk 2012-07-26
  • 打赏
  • 举报
回复
In JDK 7, interned strings are no longer allocated in the permanent generation of the Java heap, but are instead allocated in the main part of the Java heap (known as the young and old generations), along with the other objects created by the application. This change will result in more data residing in the main Java heap, and less data in the permanent generation, and thus may require heap sizes to be adjusted. Most applications will see only relatively small differences in heap usage due to this change, but larger applications that load many classes or make heavy use of the String.intern() method will see more significant differences.
adfhjk 2012-07-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

1. 是的
2. 是的。对于e="qwr";在方法区里有一块运行时常量池,存放各个类的常量池和String.intern产生的常量。我的理解是会从运行时常量池中检索"qwr"是否存在。

3. new一个对象,在堆中分配内存空间存储对象实例数据(对象中各个实例数据),如果是primitive type直接分配空间存储值,对象就是存储引用了。
[/Quote]
后来网上搜了一些,好像在heap的永生代有个interned table用于存储已经出现过的table,而检索好像是在这个table里检索的,那么这个table是全局的。
其次,你的意思是运行时常量池时和各个类的常量池不同?它是把各个类的东西放在一起,变成了global的?要不A类检索字符串的时候就只能检索自己 的那部分了。不知道我的理解对不对。
另外,对于string变量的引用是实例as直接引用heap中的string c的实例吗?
tr106501 2012-07-25
  • 打赏
  • 举报
回复
1. 是的
2. 是的。对于e="qwr";在方法区里有一块运行时常量池,存放各个类的常量池和String.intern产生的常量。我的理解是会从运行时常量池中检索"qwr"是否存在。

3. new一个对象,在堆中分配内存空间存储对象实例数据(对象中各个实例数据),如果是primitive type直接分配空间存储值,对象就是存储引用了。
dddsfdfgfdgfdg 2012-07-25
  • 打赏
  • 举报
回复
down........

62,614

社区成员

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

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