Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

常量池问题 #1592

Open
yydzxz opened this issue Mar 4, 2022 · 1 comment
Open

常量池问题 #1592

yydzxz opened this issue Mar 4, 2022 · 1 comment
Labels
待处理 待处理的issue/pr

Comments

@yydzxz
Copy link

yydzxz commented Mar 4, 2022

image
感觉对于字符串常量池和运行池的定义有问题

根据 周志明教授在这个issue fenixsoft/jvm_book#112 的讨论
以及jdk源码的注释
image

所以我觉得,每个class文件都有自己的常量池表,这个是静态的。当class被加载后放到方法去,静态的常量池表就变成运行时常量池(jvm第三版47页),在这期间还可能动态的加入一些静态常量池表以前没有的东西。而针对字符串这种常量,为了节省开销,就统一由String类的运行时常量池管理。而其他每个类自己的运行时常量池,管理自己的符号常量之类的

@Snailclimb Snailclimb added the 待处理 待处理的issue/pr label Mar 5, 2022
@xtxxtxxtx
Copy link

intern方法时如何使用的:

String s = new String("a"); s.intern();
intern是String自带的一个方法。

JDK6及之前调用intern方法时候如果字符串常量池先创建出该字符串对象,返回池中的该字符串的引用。否则将此字符串对象添加到字符串常量池中,并且返回该字符串对象的引用。

JDK6+:调用intern方法时,如果字符串常量池先前已经创建出该字符串对象,则返回池中的该字符串的引用。否则如果该字符串对象已经存在于Java堆中,则将堆中对此对象的引用添加到字符串常量池中,并且返回该引用;如果堆中不存在则池中创建该字符串并返回其引用。

简单总结一下:JDK6之后不仅在池中加载字符串对象,还会在Java堆中加载一份字符串对象。

引自本人博客:原文链接:https://blog.csdn.net/weixin_44240370/article/details/104065129

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
待处理 待处理的issue/pr
Projects
None yet
Development

No branches or pull requests

3 participants