java - JVM如何处理动态类

标签 java jvm bytecode

类定义存储在方法区中,如 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/

相关文章:

java - 在自定义 Swing 组件中获得正确的大小调整行为

java - LAN 中不同计算机上的 JVM 与其他计算机进行通信的最快方式是什么?

c++ - 使用 LLVM 生成纯机器代码

java - 我可以在 Tomcat 上加载 servlet 类之前运行代码吗?

java - -XX :OnOutOfMemoryError ="kill -9 %p" Problem

Java asm编译器

java - Java中的进化算法框架

java - Java 8 Map 中的 putIfAbsent 和 computeIfAbsent 有什么区别?

java - 如何最好地序列化 java.awt.Image?

java - 运行时查看java堆内容