- Memory usage of objects in Java
- Memory usage of some typical Java objects
- Java memory usage in more detail
- Как отслеживать использование памяти CPU и загруженность диска в Java
- Java memory usage windows
- 1. ps and pmap can show total reserved memory from OS.
- 2. jmap and jstat can show used space of heap&stack.
- 3. jmap -histo can show top heap memory objects
Memory usage of objects in Java
How much memory does an object take up in Java? How many strings, dates etc can actually fit into, say, a 256MB or 1GB Java heap?
In general, a Java object takes up a small number of bytes of housekeeping information, plus the bytes for the actual fields on each instance, including references to other objects; objects may also «waste» some space, because JVMs and/or the processor architecture will typically require object data to be aligned to some number of bytes (so that e.g. every object occupies a multiple of 8 bytes).
Memory usage of some typical Java objects
Given the above observations, the table below gives typical memory usage in bytes for various common types of Java object such as dates and strings:
Java object type | Memory usage | Observations |
---|---|---|
Integer | 16 bytes | A boxed int (Integer) will take 16 bytes when object overhead is taken in to account. (This will generally be the minimum amount of memory that any Java object will take up.) |
Long | 24 bytes | Theoretically, a long requires 4 more bytes compared to an int. But because object sizes will typically be aligned to 8 bytes, a boxed Long will generally take up 24 bytes compared to 16 bytes for an Integer. |
Date | 24 bytes | |
java.sql.Date | 24 bytes | |
LocalDate | 24 bytes | |
LocalDateTime | 48 bytes | |
Calendar (=GregorianCalendar) | 560 bytes | Beware of storing large numbers of Calendar instances: they are not a compact format for storing dates/times. |
String (16 chars) | 56 bytes | Strings that only contain characters in the single-byte range 0-255 can be stored compactly as one byte per character. (But prior to Java 9, 2 bytes per character will be required.) |
String (16 chars, Unicode) | 104 bytes | Strings that contain characters outside the single-byte range will be stored in Unicode format, generally 2 bytes per character. |
StringBuilder (100 char capacity) | 144 bytes | StringBuilders will start off requiring 1 byte per character of capacity plus overhead, but will be «expanded» to require 2 bytes per character when the first out-of-range character is added. |
EnumSet | 32 bytes | Valid for typical enums with 64 possible values or less; note that you could technically use an 8-byte long to store this information! |
byte[] with 1024 elements | 1040 bytes | The additional 16 bytes are the overhead of storing object housekeeping information and the array length. |
boolean[] with 1024 elements | 1040 bytes | Note how wasteful boolean arrays are because they use 1 byte to store 1 bit of information! |
BitSet(1024) | 168 bytes | A BitSet is a much more memory compact way of storing an array of bits in Java. Note that for a small bit set, there is still a non-negligible overhead (168 bytes compared to the theoretical size of 128 bytes to store 1024 bits). |
HashMap of 100 ints mapped to ints | ~6.75 KB | The object overhead of boxed integers plus the ‘bucket’ objects internal to HashMap mean that almost ten times as much space is required over the theoretical amount of information stored (200 ints = 800 bytes). |
Java memory usage in more detail
The articles in this section look at various aspects of memory usage in Java. Please note that some of this information is currently undergoing revision and may be a little out of date:
- how to calculate the memory use of a Java object;
- how to query the memory use of Java objects, taking advantage of the Java Instrumentation framework to ask the JVM for an object’s usage, with a link to the Classmexer agent, which provides additional calls to make querying memory usage objects and their subobjects easier.
- information on the memory usage of Strings and other objects that store character sequences, plus a look at how to reduce memory taken up by strings in Java.
If you enjoy this Java programming article, please share with friends and colleagues. Follow the author on Twitter for the latest news and rants. Follow @BitterCoffey
Как отслеживать использование памяти CPU и загруженность диска в Java
В этой статье, мы обсудим некоторые начальные команды, инструменты и методы, которые помогут отслеживать использование памяти CPU и загруженность диска в Java.
Java инструменты наблюдают за конструкциями и процессами байткода Java. Профайлеры Java следят за всеми системными командами и использованием процессора. Это позволяет вам вызвать средства в любой момент.
Стандартный профайлер предоставляет большой объем знаний, ценность которых зависит от назначения отладки. Некоторые инструменты лучше для объединения логов для всех приложений и серверов, таких как Stackify Retrace, настраивая и отслеживая автоматический лог запросов. Инструменты: Stackify’s Application Performance Management, Retrace — предлагают Java пользователям лучшее понимание устройства приложения при помощи внедренного логирования и профилирования кода. Вместе с внедренным централизованным и структурированным логированием, можно получить доступ ко всем логам приложения из единой точки для всех приложений и серверов.
Здесь мы перечислили способы демонстрации памяти и отслеживания CPU в Java для оптимизации кода.
5 способов для наблюдения за памятью CPU и загруженностью диска в Java!
- Базовые Linux команды для отслеживания использования памяти CPU и загруженности диска a)free –m Команда передает доступную и занятую память вашей виртуальной машины. b)top Эта команда для просмотра использования CPU и памяти. Когда вы введете 1 на клавиатуре, тогда topсработает и отобразит все возможные CPU и использование каждого. Всего 4 CPU — CPU0, CPU1, CPU2, CPU3 — и вся их статистика использования. c)meminfo и cpuinfo Используйте следующие команды для детальной информации относительно памяти и процессоров виртуальной машины. $cat /proc/cpuinfo$cat /proc/meminfo d) Память CPU и использование диска конкретного процесса. $ps -p [pid] -o %cpu,%mem,cmdЭта команда для отслеживания использования CPU и загруженности памяти методом приложения Java. Также отображает какие команды запустили процесс. e) Это статистика потока Java метода. $ps uH –p [pid] Эта команда предоставляет число потоков в процессе и их статистику. Это показывает как много памяти и CPU использовано для каждой угрозы и как долго они работают. Когда приложение не отвечает, эти команды могут использоваться для выполнения предыдущих запросов, прежде чем переходить к памяти и дырам в потоках. Это важные команды для первоначального исследования кроме статистики памяти и CPU. df –k –> Для проверки места на диске lsof -i : –> Для проверки, является ли данный порт открытым lsof –i: tcp –> Все установленные и слушающие TCP подключения netstat -plunt –> Подключение к сети
- Отслеживание использования памяти Далее рассмотрим класс ManagementFactory для отслеживания использования памяти. Это реализовано путем запроса к MemoryMXBean. Раздел памяти куча необходим для использования MemoryMXBean:
MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean(); System.out.println(String.format(“Initial memory: %.2f GB”, (double)memoryMXBean.getHeapMemoryUsage().getInit() /1073741824)); System.out.println(String.format(“Used heap memory: %.2f GB”, (double)memoryMXBean.getHeapMemoryUsage().getUsed() /1073741824)); System.out.println(String.format(“Max heap memory: %.2f GB”, (double)memoryMXBean.getHeapMemoryUsage().getMax() /1073741824)); System.out.println(String.format(“Committed memory: %.2f GB”, (double)memoryMXBean.getHeapMemoryUsage().getCommitted() /1073741824));
Java memory usage windows
Many commands can check the memory utilization of JAVA processes, for example, pmap, ps, jmap, jstat.
What are the differences?
Before we move forward, we need to know heap and stack.
Simply saying, heap space contains 1 Eden space , 2 young generations and 1 old generation; stack space is the permanent generation.
Here is one great article about .
Take «ResourceManager» process for example:
[root@admin ~]# jps 2304 ResourceManager
1. ps and pmap can show total reserved memory from OS.
[root@admin ~]# ps auwx|egrep "MEM|2304"|grep -v grep USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND yarn 2304 0.8 2.3 826132 192484 ? Sl 08:54 4:02 /usr/java/jdk1.7.0_45-cloudera/bin/java -Dproc_resourcemanager
[root@admin ~]# pmap -x 2304 2304: /usr/java/jdk1.7.0_45-cloudera/bin/java -Dproc_resourcemanager Address Kbytes RSS Dirty Mode Mapping 0000000000400000 4 4 0 r-x-- java 0000000000600000 4 4 4 rw--- java (. ) ---------------- ------ ------ ------ total kB 826132 192404 172608
«ps auwx|grep
«pmap -x
Because reserved memory includes shared memory also, it is hard for you to know how much heap memory are used and allocated.
2. jmap and jstat can show used space of heap&stack.
[root@admin ~]#jmap -heap 2304|egrep ":|used color: blue;">New Generation (Eden + 1 Survivor Space): used = 44627176 (42.559791564941406MB) Eden Space: used = 44264776 (42.21417999267578MB) From Space: used = 362400 (0.345611572265625MB) To Space: used = 0 (0.0MB) concurrent mark-sweep generation: used = 8410104 (8.020500183105469MB) Perm Generation: used = 32389728 (30.889251708984375MB)
[root@admin ~]# jstat -gc 2304 S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT 8064.0 8064.0 353.9 0.0 65088.0 43227.3 163520.0 8213.0 31808.0 31630.6 32 0.254 0 0.000 0.254
To understand «jstat» output, please check article firstly.
Here we can see the mapping relationship between outputs from jmap and jstat.
New Generation(used memory) = S0U+S1U+EU
concurrent mark-sweep generation(used memory) = OU
Perm Generation(used memory)=PU.
So the total used heap+stack memory size matches between «jmap» and «jstat»:
>>> (44627176+8410104+32389728)/1024.0/1024.0 81.46954345703125 >>> (353.9+0.0+43227.3+8213.0+31630.6)/1024.0 81.469531250000003
3. jmap -histo can show top heap memory objects
[root@admin ~]# jmap -histo -F 2304 |more Attaching to process ID 2304, please wait. Debugger attached successfully. Server compiler detected. JVM version is 24.45-b08 Iterating over heap. This may take a while. Object Histogram: num #instances #bytes Class description -------------------------------------------------------------------------- 1: 59262 7949504 * ConstMethodKlass 2: 59262 7595200 * MethodKlass (. ) 2721: 1 16 com.sun.research.ws.wadl.Doc$JaxbAccessorF_title Total : 440785 44864280