programacion - new icon java
¿Hay algún método similar al tamaño en Java? (12)
¿Hay algún método incorporado en Java para encontrar el tamaño de cualquier tipo de datos? ¿Hay alguna forma de encontrar el tamaño?
Como se menciona here , hay posibilidades de obtener el tamaño de los tipos primitivos a través de sus envoltorios.
por ejemplo, durante un long
esto podría ser Long.SIZE / Byte.SIZE
de java 1.5 (como ya lo mencionó zeodtr ) o Long.BYTES
partir de java 8
Decidí crear una enumeración sin seguir las convenciones estándar de Java. Tal vez te gusta esto.
public enum sizeof {
;
public static final int FLOAT = Float.SIZE / 8;
public static final int INTEGER = Integer.SIZE / 8;
public static final int DOUBLE = Double.SIZE / 8;
}
Del javaworld.com/javaworld/javaqa/2003-12/02-qa-1226-sizeof.html
Una respuesta superficial es que Java no proporciona nada como C''s sizeof (). Sin embargo, consideremos por qué un programador Java podría quererlo ocasionalmente.
El programador AC administra la mayoría de las asignaciones de memoria de la estructura de datos, y sizeof () es indispensable para conocer los tamaños de bloques de memoria que se deben asignar. Además, los asignadores de memoria C como malloc () no hacen casi nada en lo que respecta a la inicialización de objetos: un programador debe establecer todos los campos de objetos que son punteros para otros objetos. Pero cuando todo está dicho y codificado, la asignación de memoria C / C ++ es bastante eficiente.
En comparación, la asignación y construcción de objetos Java están unidas (es imposible usar una instancia de objeto asignado pero no inicializado). Si una clase Java define campos que son referencias a otros objetos, también es común establecerlos en tiempo de construcción. Por lo tanto, la asignación de un objeto Java asigna frecuentemente numerosas instancias de objetos interconectados: un gráfico de objetos. Junto con la recolección automática de basura, esto es muy conveniente y puede hacer que se sienta como si nunca tuviera que preocuparse por los detalles de asignación de memoria de Java.
Por supuesto, esto funciona solo para aplicaciones Java simples. En comparación con C / C ++, las estructuras de datos Java equivalentes tienden a ocupar más memoria física. En el desarrollo de software empresarial, acercarse a la memoria virtual máxima disponible en las JVM actuales de 32 bits es una restricción de escalabilidad común. Por lo tanto, un programador de Java podría beneficiarse de sizeof () o algo similar para vigilar si sus estructuras de datos son demasiado grandes o si contienen cuellos de botella en la memoria. Afortunadamente, la reflexión de Java le permite escribir una herramienta de este tipo con bastante facilidad.
Antes de continuar, prescindiré de algunas respuestas frecuentes pero incorrectas a la pregunta de este artículo. Falacia: Sizeof () no es necesario porque los tamaños de los tipos básicos de Java son fijos
Sí, Java int es de 32 bits en todas las JVM y en todas las plataformas, pero este es solo un requisito de especificación de idioma para el ancho perceptible por el programador de este tipo de datos. Tal int es esencialmente un tipo de datos abstracto y puede ser respaldado por, por ejemplo, una palabra de memoria física de 64 bits en una máquina de 64 bits. Lo mismo ocurre con los tipos no primitivos: la especificación del lenguaje Java no dice nada acerca de cómo los campos de clase deberían alinearse en la memoria física o que una matriz de booleanos no podría implementarse como un vector de bits compacto dentro de la JVM. Falacia: puede medir el tamaño de un objeto serializándolo en una secuencia de bytes y observando la longitud del flujo resultante
La razón por la que esto no funciona es porque el diseño de serialización es solo un reflejo remoto del verdadero diseño en memoria. Una forma fácil de verlo es observando cómo se serializan las cadenas: en la memoria, cada carácter son al menos 2 bytes, pero en forma serializada. Las cadenas están codificadas en UTF-8 y, por lo tanto, cualquier contenido ASCII ocupa la mitad del espacio
EhCache proporciona una clase SizeOf que intentará utilizar el agente de Instrumentation y recurrirá a un enfoque diferente si el agente no está cargado o no se puede cargar ( detalles aquí ).
También vea al agente de Heinz Kabutz .
Hay una clase / jar disponible en SourceForge.net que usa la instrumentación de Java para calcular el tamaño de cualquier objeto. Aquí hay un enlace a la descripción: java.sizeOf
La biblioteca Java Native Access se usa generalmente para llamar a bibliotecas compartidas nativas desde Java. Dentro de esta biblioteca existen métodos para determinar el tamaño de los objetos de Java:
El getNativeSize(Class cls)
y sus sobrecargas proporcionarán el tamaño para la mayoría de las clases.
Alternativamente, si sus clases heredan de la clase de Estructura de JNA, el método calculateSize(boolean force)
estará disponible.
La clase Instrumentation tiene un método getObjectSize (), sin embargo, no debería necesitar usarlo en tiempo de ejecución. La forma más fácil de examinar el uso de la memoria es utilizar un generador de perfiles diseñado para ayudarlo a rastrear el uso de la memoria.
No creo que esté en la API de Java. pero la mayoría de los tipos de datos que tienen un número de elementos en él, tienen un método de size()
. Creo que puede escribir fácilmente una función para verificar el tamaño usted mismo?
No. No existe tal método en la biblioteca de clases Java SE estándar.
La visión de los diseñadores es que no es necesaria en Java, ya que el lenguaje elimina la necesidad de una aplicación 1 para saber cuánto espacio debe reservarse para un valor primitivo, un objeto o una matriz con un número dado de elementos.
Podría pensar que un operador de tamaño sería útil para las personas que necesitan saber cuánto espacio ocupan sus estructuras de datos. Sin embargo, también puede obtener esta información y más, de forma sencilla y confiable, utilizando un generador de perfiles de memoria Java, por lo que no es necesario un método de tamaño.
@Davor señala que sizeof(someInt)
sería más legible que 4
. No estoy seguro de estar de acuerdo ... porque creo que cada programador de Java debería saber que un int
es siempre de 32 bits (4 bytes). (Y además, rara vez es necesario usar el tamaño de un tipo en código Java ...)
Sin embargo, si acepta ese argumento de legibilidad, entonces el remedio está en sus manos. Simplemente define una clase como esta ...
public class PrimitiveSizes {
public static int sizeof(byte b) { return 1; }
public static int sizeof(short s) { return 2; }
// etcetera
}
... e importarlo estáticamente ...
import static PrimitiveSizes.*;
¿Por qué los diseñadores de Java no lo han implementado en las bibliotecas estándar? Mi conjetura es que:
- no creen que sea necesario,
- no creen que haya suficiente demanda para ello, y
- ellos no creen que valga la pena el esfuerzo.
La palabra clave en el anterior es ellos . (No importa lo que pienses tú o yo ... a menos que tengas alguna influencia en el proceso de toma de decisiones).
También existe el problema de que la próxima demanda sería para un método de sizeof(Object o)
, que está plagado de dificultades técnicas.
1 - Es posible que un programador necesite saber para diseñar estructuras de datos eficientes. Sin embargo, no puedo imaginar por qué esa información sería necesaria en el código de la aplicación en tiempo de ejecución a través de una llamada a un método.
Pruebe java.lang.Instrumentation.getObjectSize(Object) . Pero ten en cuenta que
Devuelve una aproximación específica de la implementación de la cantidad de almacenamiento consumida por el objeto especificado. El resultado puede incluir algunos o todos los gastos generales del objeto, y por lo tanto es útil para la comparación dentro de una implementación, pero no entre implementaciones. La estimación puede cambiar durante una única invocación de la JVM.
Puede hacer manipulaciones de bits como a continuación para obtener el tamaño de primitivas:
public int sizeofInt() {
int i = 1, j = 0;
while (i != 0) {
i = (i<<1); j++;
}
return j;
}
public int sizeofChar() {
char i = 1, j = 0;
while (i != 0) {
i = (char) (i<<1); j++;
}
return j;
}
Puede usar Integer.SIZE / 8, Double.SIZE / 8, etc. para tipos primitivos de Java 1.5.