IcyFenix

Results 195 comments of IcyFenix

尽管具体实现层面上不同虚拟机可能会有一些优化措施,但在理论逻辑层面这样理解是没问题的。

我记得大概是jdk9的时候将这个参数改名了: sun.misc.ProxyGenerator.saveGeneratedFiles -> jdk.proxy.ProxyGenerator.saveGeneratedFiles

这个问题已经在勘误#6-3中修正了。

string iteral pool是jvm runtime constant pool的一个逻辑部分,在《JVMS》对runtime constant pool的定义中明确声明了这一点: ![sshot-5](https://user-images.githubusercontent.com/5801867/116958941-b7b0f480-acce-11eb-89cd-436191b21568.png) 这段(以及后面未贴出的一页)正好解释了String.intern()方法与runtime constant pool的交互。 Issues中提到的: > 可以看到Constant pool,这个应该才是jvms中提到的运行时常量池,您在书中也有提到 似乎混淆了constant pool和runtime constant pool的概念,前者是定义在Class文件格式之中,存储的Class文件中直接使用到的,编译期已经静态可知的符号,后者是定义在虚拟机类加载(Loading、Linking、Initalizing)行为之中,存储的不仅包括constant pool中的静态符号,还包括了程序运行期动态产生的符号,所以带有“runtime”的定语。它们两者是具有不同作用的独立概念。

有不同意见是好事,欢迎讨论。 > 而且现在字符串常量池已经不在方法区了。 这个结论并不正确,我明白你想说的是HotSpot在JDK8之后的变动,是指:“JDK 8后,HotSpot虚拟机已经不再使用以前PermGen来实现方法区了,类型信息挪到Metaspace,类变量、字面量等信息挪到了Heap中了”。 但后面这个事实并不能推导出前面的结论,运行时常量池、方法区、字符串常量池这些都是不随虚拟机实现而改变的逻辑概念,是公共且抽象的,Metaspace、Heap是与具体某种虚拟机实现相关的物理概念,是私有且具体的。 虚拟机规范提倡的理念是“公有设计,私有实现”,我们可以说“目前版本的HotSpot没有将字符串常量池放在元空间中",但是不能说“现在的JVM不再将字符串常量池放在方法区中”。无论是哪一种Java虚拟机,无论它是使用PermGen(8之前的HS),还是JavaHeap(8之后的HS),抑或是CHeap(J9)来存放字面量,都不影响字符串常量仍然是运行时常量的一个子集,因为它们都是逻辑上的概念,所有Java虚拟机一致的外观。 其实“字符串常量池”这个说法,也是因为HotSpot本身实现了这个概念,大家已经形成习惯。其实在JVMS中只陈述了字面量应该不重复地存储在运行时常量池之中,并没有定义过字符串常量“池”的概念。但有一点是明确的,无论我回帖贴截图中《JVMS 15》的表述,还是你翻译的《JVMS 11》的表述,都规定了: - 字面量(String Literal)以CONSTANT_String_info结构存储在运行时常量池中。 - 如果一个全新的String首次执行intern()方法,会产生一个新的字面量。 最后,关于这句话:“并非预置入Class文件中常量池的内容才能进入方法区运行时常量池”,具体是与翻译中的哪一部分相抵触?

> 此问题已困扰我多年 没那么夸张吧。“此问题”我看描述不知道具体是指哪个?先把“`字符串常量池是否属于运行时常量池`”和“`String.intern方法的行为`”分开来讨论。你明确后描述疑问后可以再进一步展开。 对于前者,这个结论是否能认可? > 字面量(String Literal)以CONSTANT_String_info结构存储在运行时常量池中。 如果能认可,那字符串常量池就是虚拟机中存储字面量的集合,既然字面量是存储在运行时常量池的结构之一,那字符串常量池自然是它的子集。 如果不能认可,你的疑问点是什么? 对于后者,前面中文的说法有歧义,所指的就是你贴出的这行原文: > a new instance of class String is created containing the sequence of Unicode code points given by the CONSTANT_String_info...

> > 字面量(String Literal)以CONSTANT_String_info结构存储在运行时常量池中。 > > 周老师,这句话我认可。 > > 但 字符串常量池就是虚拟机中存储字面量的集合 这句话不认可。 > > String str = "abc"; > "abc"是字面量,这个字面量是啥,我在上一回复中有说明。 > > String str = String.valueOf(6666666).intern() > 这里没有字面量,会生成一个string对象,放在字符串常量池中。 > >...

> 周老师,constant pool与runtime constant pool之间的关系如下: > > > A class file keeps all its symbolic references in one place, the constant pool. Each class file has a constant pool, and...

这个可能是个语文问题。 card table在JVM中是解决ygc要扫描整个老年代的加速手段,目的是加速ygc收集,记录的信息是**老年代**哪些区域引用新生代的对象,是一种points-out实现,这里的“我”指代老年代。