gpt4 book ai didi

java - JVM如何处理动态类

转载 作者:行者123 更新时间:2023-12-05 08:58:00 25 4
gpt4 key购买 nike

类定义存储在方法区中,如 Java 虚拟机规范所述 (The Java® Virtual Machine Specification Java SE 7 Edition):

The method area is created on virtual machine start-up. Although the method area is logically part of the heap, simple implementations may choose not to either garbage collect or compact it.

据我们所知,一些字节码工具如ASMcglibjavassist、Hibernate 和Spring 框架都在使用它们。对于一个普通的类文件,JVM加载解析初始化最后使用,我很困惑JVM是如何动态处理字节码工具生成的类的。我的问题是:

  1. JVM是否将动态类作为普通类文件进行加载、解析和初始化?

  2. 它们是否也存储在方法区中?

  3. JVM 如何卸载和清理动态类定义以防止自身发生 OutOfMemoryError?

最佳答案

所有类都在运行时加载,可能编译为 native 代码。因此,程序启动后生成的类没有什么特别之处。

If JVM loads, parses and initializes the dynamic classes as the common class file?

它的加载方式与程序启动时存在的类相同。

Are they stored in the Method Area as well?

它们以相同的方式存储,实际上很难判断一个类是否是动态的。

How does JVM unload and clean the dynamic class definitions to prevent itself from occurring an OutOfMemoryError?

JVM 可以在卸载类所在的 ClassLoader 时卸载类。无论类是否动态都是如此。

how could the JVM know to treat dynamic classes any differently than 'normal' classes?

有一个特殊的动态类的例子。这些是在运行时生成的 lambda 类。使它们不同的是它们没有绑定(bind)到类加载器,它们甚至没有普通的类名。当该类的所有实例都未使用时,它们将被卸载。

来自 InnerClassLambdaMetafactory

UNSAFE.defineAnonymousClass(targetClass, classBytes, null);

该类没有附加类名(也没有类加载器)

关于java - JVM如何处理动态类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28098080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com