[Question post] I would like to ask a few questions about memory allocation policies of Java virtual machines.
I recently read Zhou Zhiming's "deep understanding of Java virtual machines", but I have a few questions that I don't quite understand. I hope my friends who have research on virtual machines can help me solve them.
First, let's talk about the environment I tested:
Operating System: Mac OS X 10.11.6 EI CapitanJava Environment: java version "1.8.0 _ 92" Java (TM) SE Runtime Environment (build 1.8.0 _ 92-b14) Java HotSpot (TM) 64-Bit Server VM (build 25.92-b14, mixed mode)
1. I found that in the young generation, even if I was just an empty class and didn't perform any memory allocation work, the memory in the Eden area would still be occupied. The example is as follows:
public class BlankedClassSize { public static void main(String[] args) { // TODO Auto-generated method stub }}
Virtual Machine parameter settings:
-verbose:gc -XX:+UseSerialGC -XX:+PrintGCDetails -Xmx20M -Xms20M -Xmn10M
The GC of the virtual machine is as follows:
Heapdef new generation total 9216K, used1164K[0x00000007bf000000, 0x00000007bfa00000, 0x00000007bfa00000)eden space 8192K, 14% used [0x00000007bf000000, 0x00000007bf1231d0, 0x00000007bf800000)from space 1024K, 0% used [0x00000007bf800000, 0x00000007bf800000, 0x00000007bf900000)to space 1024K, 0% used [0x00000007bf900000, 0x00000007bf900000, 0x00000007bfa00000)tenured generation total 6144K, used 0K [0x00000007bfa00000, 0x00000007c0000000, 0x00000007c0000000)the space 6144K, 0% used [0x00000007bfa00000, 0x00000007bfa00000, 0x00000007bfa00200, 0x00000007c0000000)Metaspace used 2666K, capacity 4486K, committed 4864K, reserved 1056768Kclass space used 289K, capacity 386K, committed 512K, reserved 1048576K
Question 1: What occupies the memory?
2. When the young generation carries out a GC, because the young generation GC uses a replication algorithm to collect memory, why is the memory occupied by the Eden region not zero after a Minor GC operation? What is memory used? Example:
public class MinorGC { private static final int_1MB = 1024*1024; public static void main(String[] args) { // TODO Auto-generated method stub testEdenGC(); } public static void testEdenGC(){ byte[] allocation1,allocation2,allocation3,allocation4,allocation5,allocation6; allocation1=newbyte[_1MB]; allocation2=newbyte[_1MB]; allocation3=newbyte[_1MB]; allocation4=newbyte[_1MB]; allocation5=newbyte[_1MB]; allocation6=newbyte[_1MB]; }}
Virtual Machine parameter settings:
-verbose:gc -XX:TenuringThreshold=1 -Xms20M -Xmx20M -Xmn10M -XX:SurvivorRation=3 -XX:+PrintGCDetails -XX:+UseSerialGC
Virtual Machine GC:
[GC (Allocation Failure) DefNew: 6029K->1354K(8192K), 0.0032985 secs] 6029K->5450K(18432K), 0.0033216 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]Heapdef new generation total 8192K, used 2440K [0x00000007bec00000, 0x00000007bf600000, 0x00000007bf600000)eden space 6144K, 17% used [0x00000007bec00000, 0x00000007bed0f748, 0x00000007bf200000)from space 2048K, 66% used [0x00000007bf400000, 0x00000007bf5529b0, 0x00000007bf600000)to space 2048K, 0% used [0x00000007bf200000, 0x00000007bf200000, 0x00000007bf400000)tenured generation total 10240K, used 4096K [0x00000007bf600000, 0x00000007c0000000, 0x00000007c0000000)the space 10240K, 40% used [0x00000007bf600000, 0x00000007bfa00040, 0x00000007bfa00200, 0x00000007c0000000)Metaspace used 2666K, capacity 4486K, committed 4864K, reserved 1056768Kclass space used 289K, capacity 386K, committed 512K, reserved 1048576K
Question 2: According to 6026 K-> 1354 K (8192 K), after GC, allocation1 is transferred to region vor1, allocation2 ~ 4. Transferred to the elderly zone. At this time, the eden still has 13 54k of memory occupied. What is occupied? According to 6029 K-> 5450 K (18432 K), after GC is known, the Java heap memory is reduced by 579 K, whose memory is reduced (obviously several newly created objects are reachable and will not be recycled )?
3. when memory is allocated to new objects, a minor GC occurs because the young generation has insufficient space. The surviving objects in the young generation are copied to the old generation to free up space for new objects, according to my experiment, if the memory in the elderly area is insufficient, the young generation objects will be copied but new objects will be stored. (the guarantee will fail) the new object will be directly put into the old age, for example:
public class MinorGC { private static final int_1MB = 1024*1024; public static void main(String[] args) { // TODO Auto-generated method stub testAllocation(); } public static void testAllocation(){ byte[] allocation1,allocation2,allocation3,allocation4; allocation1 = newbyte[2*_1MB]; allocation2 = newbyte[2*_1MB]; allocation3 = newbyte[2*_1MB]; allocation4 = newbyte[4*_1MB]; }}
The virtual machine parameter settings are as follows:
-verbose:gc -Xms16M -Xmx16M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8 -XX:+HeapDumpOnOutOfMemoryError -XX:MaxTenuringThreshold=15 -XX:+UseSerialGC
GC:
[GC (Allocation Failure) [DefNew (promotion failed) : 7144K->7474K(9216K), 0.0028055 secs][Tenured: 4096K->4096K(6144K), 0.0015627 secs] 7144K->6473K(15360K), [Metaspace: 2660K->2660K(1056768K)], 0.0044048 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]Heapdef new generation total 9216K, used 6555K [0x00000007bf000000, 0x00000007bfa00000, 0x00000007bfa00000)eden space 8192K, 80% used [0x00000007bf000000, 0x00000007bf666ed0, 0x00000007bf800000)from space 1024K, 0% used [0x00000007bf900000, 0x00000007bf900000, 0x00000007bfa00000)to space 1024K, 0% used [0x00000007bf800000, 0x00000007bf800000, 0x00000007bf900000)tenured generation total 6144K, used 4096K[0x00000007bfa00000, 0x00000007c0000000, 0x00000007c0000000)the space 6144K, 66% used [0x00000007bfa00000, 0x00000007bfe00020, 0x00000007bfe00200, 0x00000007c0000000)Metaspace used 2666K, capacity 4486K, committed 4864K, reserved 1056768Kclass space used 289K, capacity 386K, committed 512K, reserved 1048576K
According to the above output, we can see that during the GC process, the young generation's 7144 K-> and 7144 K (9216 K) did not transfer the objects in the young generation, in the old age, 4096 K-> 4096 K (6144 K), tenured generation total 6144 K, and used 4096 K indicate that allocation4 was directly transferred to the old age.
Question 3: in this case, does a virtual opportunity automatically set a large object threshold ?? Put the new object directly into the old age?
The above three questions cannot be solved by Tom on this virtual machine. I hope you can help me to explain them. Thank you for your consideration.