Возможно ли получить размер Vector или ArrayList или любого объекта в этом случае в байтах в java? size() дает только количество элементов. Но я хочу получить фактический размер объекта.Java: размер вектора в байтах
ответ
На данный момент я реализовал свои собственные для получения размера.
long sizeof(ArrayList<String> list)
{
long size = 0;
for(String s: list)
size+=s.length();
return size;
}
Это не работает так ... Каждая строка имеет накладные расходы, сам список имеет накладные расходы и т. Д. – assylias
Это не то, о чем спрашивает ОП. Он сказал размер в байтах и не упоминал String ArrayList, просто объекты. – Averroes
@assylias: Насколько велика эта накладная может повлиять на общий размер списка? Я предполагаю, что приведенный выше код мог бы дать мне достаточно хорошую оценку размера объекта. – rahul
Различные JDK, имеющие разный размер для объектов имплицита.
Вы можете посчитать его размером объекта implicite умножить длину вектора или arraylist. Например, если вы объявляете araylist целого числа с 10 записями в нем, то Целочисленные числа Java составляют 32 бита, то есть 32/8 = 4 байта. У вас есть 10 записей, поэтому 10x4 = 40 байт.
в стандартном java-байте = 8 бит, short = 16бит, int = 32бит, long = 64 бит.
Первое: попробуйте прочитать Does Java have an operator like "sizeof()" in C
Второе: Try this code:
public class Sizeof
{
public static void main (String [] args) throws Exception
{
// Warm up all classes/methods we will use
runGC();
usedMemory();
// Array to keep strong references to allocated objects
final int count = 100000;
Object [] objects = new Object [count];
long heap1 = 0;
// Allocate count+1 objects, discard the first one
for (int i = -1; i < count; ++ i)
{
Object object = null;
// Instantiate your data here and assign it to object
object = new Object();
//object = new Integer (i);
//object = new Long (i);
//object = new String();
//object = new byte [128][3]
if (i >= 0)
objects [i] = object;
else
{
object = null; // Discard the warm up object
runGC();
heap1 = usedMemory(); // Take a before heap snapshot
}
}
runGC();
long heap2 = usedMemory(); // Take an after heap snapshot:
final int size = Math.round (((float)(heap2 - heap1))/count);
System.out.println ("'before' heap: " + heap1 +
", 'after' heap: " + heap2);
System.out.println ("heap delta: " + (heap2 - heap1) +
", {" + objects [0].getClass() + "} size = " + size + " bytes");
for (int i = 0; i < count; ++ i) objects [i] = null;
objects = null;
}
private static void runGC() throws Exception
{
// It helps to call Runtime.gc()
// using several method calls:
for (int r = 0; r < 4; ++ r) _runGC();
}
private static void _runGC() throws Exception
{
long usedMem1 = usedMemory(), usedMem2 = Long.MAX_VALUE;
for (int i = 0; (usedMem1 < usedMem2) && (i < 500); ++ i)
{
s_runtime.runFinalization();
s_runtime.gc();
Thread.currentThread().yield();
usedMem2 = usedMem1;
usedMem1 = usedMemory();
}
}
private static long usedMemory()
{
return s_runtime.totalMemory() - s_runtime.freeMemory();
}
private static final Runtime s_runtime = Runtime.getRuntime();
} // End of class
Это должно показать Использование памяти
Runtime rt = Runtime.getRuntime();
long m0 = rt.totalMemory() - rt.freeMemory();
Object obj = new Object(); // create your object here
long m1 = rt.totalMemory() - rt.freeMemory();
System.out.println(m1 - m0);
, но он не работает. Это работает (по крайней мере, на моем компьютере)
public static void main(String[] args) throws Exception {
Object obj = createObject();
long m0 = usedMem();
long m1 = usedMem();
obj = null;
for (int i = 0; i < 100; i++)
System.gc();
m0 = usedMem();
obj = createObject();
for (int i = 0; i < 100; i++)
System.gc();
m1 = usedMem();
System.out.println(m1 - m0);
}
private static long usedMem() {
return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
}
private static Object createObject() {
return new Object();
}
если он печатает 8
для нового объекта и 40
для новой строки(), то она работает правильно, а затем создать свой объект и увидеть его размер
Подробнее здесь http://www.javaspecialists.eu/archive/Issue029.html
- 1. Получение размера в байтах вектора
- 2. Java японский размер символов строки в байтах
- 3. Enum Размер в байтах
- 4. Размер класса в байтах
- 5. (Java) набор размер вектора
- 6. Размер неупорядоченной карты в байтах
- 7. получить размер изображения в байтах
- 8. svn размер ревизии в байтах
- 9. Получить размер изображения в байтах
- 10. Максимальный размер файла в байтах
- 11. Размер словаря объекта в байтах
- 12. Расчет размера вектора векторов в байтах
- 13. Как рассчитать размер битового набора в байтах?
- 14. Размер вектора вектора C++
- 15. Есть ли способ получить размер в байтах строки в Java?
- 16. Фактический размер в байтах, занимаемый массивом x datatype в java?
- 17. Как получить размер ответа HTTP в Java (в байтах)
- 18. Размер вектора в C++
- 19. Размер передачи JDBC SQL в байтах?
- 20. NodeJs получить размер переменной в байтах
- 21. Неточный размер NSData, указанный в байтах
- 22. Лучший способ сохранить размер файла в байтах?
- 23. Как узнать размер строки в байтах?
- 24. Размер UTF-8 строки в байтах
- 25. Размер в байтах аргументов функции многоточием
- 26. Ruby получить размер в байтах массива
- 27. Рассчитать размер в байтах строки Swift
- 28. Как получить размер в байтах значения TEXTAREA
- 29. C++ получить размер (в байтах) EOL
- 30. Как рассчитать размер узлов в байтах
* «Но я хочу получить фактический размер объекта». * Почему? –
Да, это возможно, если вы можете рассчитать байты отдельного объекта в этом векторе/массиве. – Ankit
Как правило, вам не нужно это знать, но если вы действительно делаете простейший шаг, это использовать профайлер памяти. например бесплатный VisualVM, который поставляется вместе с JDK. –