xmx increase data check java heap

increase - java heap xmx



Cómo encontrar el número de objetos en el montón (10)

Hay un truco que puedes probar:

  • crea tu propio java.lang.Object (copia la fuente original)
  • contar los objetos creados en el constructor (no se llama para arreglos)
  • agregue la ruta a su archivo de clases a la ruta de clases de arranque

Ver este article (antiguo) para una muestra.

Probablemente hay mejores maneras de hacerlo usando JPDA o JMX , pero no he encontrado cómo ...

¿Cómo puedo encontrar el número de objetos vivos en el montón en el programa Java?


Para la depuración, puede usar un generador de perfiles (como YourKit, un generador de perfiles Java comercial). Encontrará variantes de código abierto y comerciales de perfiladores de Java.

Para la integración con su código, puede utilizar la técnica de "Programación Orientada a Aspectos". Los marcos AOP (por ejemplo, AspectWerkz) le permiten cambiar los archivos de clase en el tiempo de carga de la clase. Esto le permitirá modificar los constructores para registrar objetos en su "todo-mi-tiempo de ejecución-objetos-marco".


Por lo que sé, no puedes. Sin embargo, puede obtener la cantidad de memoria utilizada para el programa:

Runtime rt = Runtime.getRuntime(); System.out.println("Used: " + (rt.totalMemory() - rt.freeMemory()); System.out.println("Free: " + rt.freeMemory()); System.out.println("Total: " + rt.totalMemory());


Si todos sus objetos se crean utilizando algún tipo de clase de Factory , puede encontrar el número de objetos en el montón. Incluso entonces tienes que tener algo en el método finalize() . Por supuesto, esto no se puede hacer para todos los objetos, por ejemplo, las clases de la biblioteca jdk no se pueden modificar. Pero si desea encontrar el número de instancias de una clase en particular que haya creado, puede encontrarlo potencialmente.


Usa jvisualvm , y haz una muestra de memoria. Se mostrará el número de clases e instancias:


jmap es la utilidad java estándar que puede utilizar para capturar volcados de pila y estadísticas. No puedo decir qué protocolo utiliza jmap para conectarse a la JVM para obtener esta información, y no está claro si esta información está disponible para un programa que se ejecuta en la JVM directamente (aunque estoy seguro de que el programa puede consultar su JVM). a través de algún socket para obtener esta información).

JVM TI es una interfaz de herramienta utilizada por el código C, y tiene un acceso bastante completo a las funciones de la JVM, pero es un código C y no está disponible directamente por la JVM. Probablemente podrías escribir un C lib y luego interactuar con él, pero no hay nada fuera de la caja.

Hay varios MBM de JMX, pero no creo que ninguno de ellos proporcione un recuento real de objetos. Sin embargo, puede obtener estadísticas de memoria de estos (esto es lo que utiliza JConsole). Echa un vistazo a las clases de gestión java.lang.

Si quieres algo rápido (fácil de implementar, no necesariamente un resultado rápido, ya que un mapa j lleva algo de tiempo), me gustaría descifrar una serie de mapas y simplemente leer el archivo resultante.


La forma más sencilla es utilizar la herramienta jmap . Si imprime el histograma de objetos al final, verá el número total de instancias y también el tamaño acumulado de todos los objetos:

jmap -histo <PID> imprimirá objetos completos con número de instancias y tamaño. La última línea contendrá el número total

Total 2802946 174459656

La segunda columna es el total de instancias y el último es el total de bytes.


class Test1 { static int count=0; public Test1() { count++; System.out.println("Total Objects"+" "+count); } } public class CountTotalNumberOfObjects { public static void main(String[] args) { Test1 t = new Test1(); Test1 t1 = new Test1(); Test1 t3 = new Test1(); Test1 t11 = new Test1(); Test1 t111 = new Test1(); Test1 t13 = new Test1(); } }


public class NumOfObjects { static int count=0; { count++; } public static void main(String[] args) { NumOfObjects no1=new NumOfObjects(); System.out.println("no1:" + count);//1 NumOfObjects no2=new NumOfObjects(); System.out.println("no2:"+ count); //2 for (int i=0; i<10;i++) { NumOfObjects noi=new NumOfObjects(); } System.out.println("Total objects:"+count);// 12 } }


public class ObjectCount { static int i; ObjectCount() { System.out.println(++i); } public static void main(String args[]) { ObjectCount oc = new ObjectCount(); ObjectCount od = new ObjectCount(); ObjectCount oe = new ObjectCount(); ObjectCount of = new ObjectCount(); ObjectCount og = new ObjectCount(); } }