¿Cómo puedo encontrar la cantidad de objetos activos en el montón en el programa Java?Cómo encontrar el número de objetos en el montón
Respuesta
Hay un truco que puede probar:
- crear su propia java.lang.Object (copiar la fuente original)
- contar los objetos creados en el constructor (no llamada para arrays)
- agregar la ruta de acceso al archivo de clase a la ruta de clases de arranque
ver esto (antiguo) article para una muestra.
Probablemente hay mejores maneras de hacerlo usando JPDA o JMX, pero no he encontrado la forma ...
1) Cuidado: este truco * podría * desestabilizar su JVM. 2) No creo que cuente los objetos "creados" al deserializar una secuencia de objetos serializados. (La deserialización predeterminada omite los constructores de objetos.) –
Hasta donde yo sé, no se puede. Puede, sin embargo, obtener la cantidad de memoria utilizada por 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 los objetos son creados usando algún tipo de Factory
clase se puede encontrar el número de objetos en el montón. Incluso entonces debes tener algo en el método finalize()
. Por supuesto, esto no se puede hacer para todos los objetos, p. 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.
si tengo algo como String a = "abc"; a = a + "def"; Cómo rastreará el número de objetos a través de su fábrica –
Para la depuración, puede utilizar un generador de perfiles (como YourKit, un generador de perfiles de java comercial). Encontrará variantes de fuente abierta y comerciales de los perfiles 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 constructores para registrar objetos en su "all-my-runtime-objects-framework".
jmap es la utilidad java estándar que puede usar para capturar volcados de almacenamiento dinámico y estadísticas. No puedo decir qué protocolo usa 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 directamente en la JVM (aunque estoy seguro de que el programa puede consultar su JVM a través de un socket para obtener esta información).
JVM TI es una interfaz de herramienta utilizada por el código C, y tiene acceso bastante completo a los eventos de la JVM, pero es código C y no está disponible directamente por la JVM. Probablemente puedas escribir una biblioteca en C y luego interactuar con ella, pero no hay nada fuera de la caja.
Existen varios MBeans 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 JConsole usa). Consulte las clases de java.lang.management.
Si quieres un resultado rápido (fácil de implementar, no necesariamente un resultado rápido ya que un jmap toma algo de tiempo), me saltaría una ejecución de jmap y simplemente leeré el archivo resultante.
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();
}
}
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
}
}
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();
}
}
La forma más sencilla es utilizar jmap
herramienta. Si va a imprimir el histograma de objetos al final, verá el número total de instancias y el tamaño acumulado de todos los objetos:
jmap -histo <PID>
imprimirá objetos enteros con número de instancias y tamaño. La última línea contiene número total
Total 2802946 174459656
segunda columna se cuentan casos totales, y la última es el total de bytes.
- 1. Objetos asignados en el montón
- 2. Objetos en el montón y referencias
- 3. ¿Tipos de valores en objetos almacenados en el montón también?
- 4. ¿Cómo encontrar el número de línea del cursor en Python?
- 5. Encontrar el número de núcleos en Java
- 6. cómo borrar el montón?
- 7. Cómo maximizar el bloque contiguo más grande de memoria en el montón de objetos grandes
- 8. ¿El montón es realmente un montón?
- 9. Encontrar el número de versión de Eclipse
- 10. cómo contar el número de objetos creados en C++
- 11. ¿Cómo devolver el número de objetos actualizados en mongodb?
- 12. ¿Cómo puedo encontrar el número primo más cercano?
- 13. Encontrar el número de inversiones de permutación
- 14. ¿Cómo puede encontrar el número de procesador en el que se está ejecutando un subproceso?
- 15. C++ Encontrar el mayor número en serie
- 16. javascript cómo encontrar el número de hijos en un objeto
- 17. ¿Cómo encontrar el número de días del mes en curso
- 18. ¿Cómo encontrar el número de células en UITableView
- 19. ¿Cómo encontrar el número de inversiones en una matriz?
- 20. Encontrar el número de procesos secundarios
- 21. Determinar dónde se produjeron las asignaciones de objetos para los objetos en el montón
- 22. SQL - ¿Cómo encontrar el número más alto en una columna?
- 23. ¿Cómo encontrar el número más alto en una matriz?
- 24. Cómo encontrar el número de líneas de UILabel
- 25. ¿Cómo encontrar el número de fila de un registro?
- 26. ¿Cómo encontrar el número de puerto de la dirección IP?
- 27. Cómo encontrar el número de líneas de UITextView
- 28. Cómo encontrar el número de versión de libxxx.a
- 29. Usar el recuento para encontrar el número de ocurrencias
- 30. Encontrar el número de errores en un proyecto de eclipse
¿Por qué motivo necesita saber la cantidad de objetos de pila en vivo? Es probable que haya una mejor manera de hacer lo que quiera. –
¿Desea obtener esta información desde el propio programa? ¿O usando una herramienta de depuración? –