2012-06-18 19 views
5

Tengo una clase y me gustaría ver qué subobjetos ocupan más espacio cuando el objeto de esta clase se serializa. ¿Hay alguna buena herramienta/forma de hacerlo, excepto mirar el código y analizarlo manualmente?Java: ¿forma fácil de inspeccionar la estructura del objeto serializado?

Por ejemplo, me gustaría que la herramienta diga "miembro a ocupa el 20%, b 30% y el miembro c ocupa el 50%".

Gracias

P.S. Encontré algunas preguntas relacionadas, pero no encontré respuesta a mi pregunta específica allí.

+0

posiblemente relacionados: [Tamaños de objetos Java con Estimación de Instrumentación] (http://marxsoftware.blogspot.com/2011/12/estimating-java-object-sizes-with .html) – npe

+0

Ver mi comentario a # alexey28 - Estoy interesado en la estructura del objeto serializado, no en la estructura del objeto en la memoria – duduamar

+1

No hay 'sub-objetos' en java. Y no es un problema semántico. ¿Cómo se cuenta el porcentaje si dos miembros de un objeto tienen miembros comunes? – aalku

Respuesta

-1

Bueno, nunca escuché acerca de esa herramienta. Pero creo que hay alguna relación entre el tamaño del objeto en la memoria y el tamaño del objeto serializado. De modo que puede intentar usar un generador de perfiles: VisualVM, que está incluido en JDK o en mi favorito YourKit Profiler.

+1

Existe cierta relación pero no esa relación fuerte: la clase puede elegir serializar algunos miembros y descartar otros. Esto puede cambiar por completo la imagen ... – duduamar

+0

Permite el acceso a otras respuestas. Si nadie conoce esta herramienta y necesita una medición de precisión, debe escribir la suya para hacerlo. – alexey28

1

La única manera relativamente rápida de contar el tamaño del objeto es escribir primero el objeto completo, contar el uso (por ejemplo, escribir en ByteArrayOutputStream) y luego escribir cada objeto al que se hace referencia.

Hay un par de esto para tener en cuenta:

  • El ObjectOutputStream hace hacer algo de almacenamiento en caché para poder referirse a un objeto previamente escrito con un simple puntero. Use el método de reinicio() para borrar este caché.
  • Cada nuevo tipo de objeto que se escribe, primero tiene la descripción de la clase. La sobrecarga de esto depende de la cantidad de objetos del mismo tipo a los que te refieres.
  • Hay una sobrecarga (pequeña de 4 bytes) para inicializar ObjectOutputStream.

Para la descripción del protocolo, lea this description.

+0

Esa es la forma en que pensé hacerlo, a menos que obtenga una mejor respuesta, este será el camino. Gracias. – duduamar

Cuestiones relacionadas