有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java是在类常量池、字符串池还是年轻一代中为字符串文本分配的空间?GC何时可以访问字符串文字?

我读了the following stackoverflow question,但仍有几个问题不清楚

假设我有以下java类:

class Main {
    public static void main(String[] args) {
        String str = "hello";
    }
}

当一个主要的。编译java文件时,所有对变量和方法的引用都作为符号引用存储在类的常量池中(存储在Main.class文件中)。符号引用是逻辑引用,而不是实际指向物理内存位置的引用

类常量池将具有表示“hello”字符串文字的Utf8

Constant pool:
   #1 = Methodref          #4.#13         // java/lang/Object."<init>":()V
   #2 = String             #14            // hello
   #3 = Class              #15            // Main
   #4 = Class              #16            // java/lang/Object
   #5 = Utf8               <init>
   #6 = Utf8               ()V
   #7 = Utf8               Code
   #8 = Utf8               LineNumberTable
   #9 = Utf8               main
  #10 = Utf8               ([Ljava/lang/String;)V
  #11 = Utf8               SourceFile
  #12 = Utf8               Main.java
  #13 = NameAndType        #5:#6          // "<init>":()V
  #14 = Utf8               hello          /////// CONSTANT_Utf8_info entry ///////
  #15 = Utf8               Main
  #16 = Utf8               java/lang/Object

public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=1, locals=2, args_size=1
         0: ldc           #2                  // String hello
         2: astore_1
         3: return
      LineNumberTable:
        line 3: 0
        line 4: 3

注意#14恒定池输入

当JVM加载并链接Main时。类文件,它在方法区域的堆上为该类创建运行时类常量池(我假设这是.class文件中类常量池的对象表示)。对于来自的Utf8条目。类文件JVM在链接过程中创建CONSTANT_Utf8_info对象

根据规范CONSTANT_Utf8_info对象包含表示“hello”字符串的字节数组。这个字节数组是在运行时类常量池、字符串池还是在堆的年轻生成空间中分配的

字符串池数据结构的深度如何?它是否包含对运行时类常量池中字符串文本的引用或表示字符串文本的哈希表/数组

基于the following,文章字符串池被认为是Hashtable<oop, Symbol>,但不清楚什么是oop和符号以及它们代表什么数据结构

您能否解释一下,当JVM执行上面字节码中的“ldc#2”行时,内部会发生什么情况(内存是如何分配的,在什么空间中,堆栈上有什么内容)

您能说GC何时可以访问“hello”字符串文本吗

如果您在回答这个问题时留下一些官方JVM规范的链接和一些证明,我将非常感激


共 (0) 个答案