outofmemoryerror maxmetaspacesize java jvm jvm-hotspot permgen

java - maxmetaspacesize - Qué es Klass & KlassKlass



java.lang.outofmemoryerror: metaspace (3)

¿Qué es Klass & KlassKlass en la implementación de hotspot JVM?

Por lo que entendí del artículo Presentando la generación de Klass , Klass es la representación interna de una clase Java (digamos A ) y contendrá la información básica sobre la estructura de la clase, incluido el código de bytes. Se almacenará como un objeto en sí mismo. Cada objeto de la clase A tendrá un puntero a la representación interna que Klass presenta en PermGen

KlassKlass es la representación interna de la clase Klass . ¿Por KlassKlass se necesita KlassKlass ? ¿Qué información extra está almacenando?

Además, un KlassKlass''s Klass KlassKlass''s apunta a sí mismo, yo tampoco lo entendí.


La generación permanente aka permgen es la referencia al lugar donde se almacena toda la información relacionada con la clase. Es ocasionalmente referido como área de método.

Tomemos un ejemplo del siguiente código:

public class Parent { ... }

Aquí:

  • new Parent() es un objeto de la clase Parent .
  • (new Parent()).getClass() refiere a Klass of Parent. El tipo de referencia para este objeto sería java.lang.Class<Parent> . Esto almacenaría la información sobre las anotaciones de los Parent , constructores, campos, métodos, su herencia (superclase, interfaces), etc.
  • KlassKlass sería (new Parent()).getClass().getClass() . El tipo de referencia para este objeto sería java.lang.Class<java.lang.Class> . Esto define la información sobre las anotaciones de java.lang.Class , constructores, campos, métodos, su herencia (superclase, interfaces), etc.

Teóricamente, esta cadena podría continuar pero KlassKlassKlass sería igual que KlassKlass.

En resumen, KlassKlass significa que tendría un objeto java.lang.Class que define el comportamiento de java.lang.Class .

Espero que esto ayude


Parece que tienes un buen conocimiento general de la administración de almacenamiento en HotSpot. Para obtener algunos detalles más específicos, es una buena idea ir a la boca del caballo, en este caso los desarrolladores de HotSpot. Esta página es su descripción del sistema de gestión de almacenamiento.

En situaciones en las que quiero descubrir qué código intento, encuentro el código y lo leo. En este caso podemos encontrar una implementación de la clase KlassKlass here . Parece que esto no agrega información adicional a Klass , lo que es muy interesante de ver. Tenga en cuenta que KlassKlass extiende Klass .

Entonces, ¿por qué lo necesitamos? Bueno, podemos dibujar la jerarquía de Klass de un programa en particular como un árbol donde Klass describe otro. Todo necesita una descripción, pero no podemos seguir así para siempre, necesitamos encontrar un punto fijo en el que lo que usamos para describir algo sea en sí mismo, ¡así que podemos detenernos!

Entonces, en resumen, KlassKlass no hace nada más útil que existente. Necesita existir pero su existencia es razonablemente poco interesante.


Un klass se puede definir como una plantilla / impresión azul que describe los comportamientos / estados que el objeto de su tipo admite.