Java运行时内存分配图:(出自深入理解Java虚拟机)
我们常用的主要是:
方法区:存储类信息数据、静态方法、静态量、还有常量池。
堆:存放对象实例。
虚拟机栈(线程私有):存储局部变量表、操作栈、动态链接、方法出口等信息。
一个普通对象在内存的存储:
栈中存储对象引用;
堆中存储对象本身;
方法区中存储对象类信息、静态方法、静态常量信息;
对于堆的详解:
新生代:MinorGC;
老生代:FullGC;
永久代:存储元数据,就是方法区;
MinorGC:新生代触发的GC,当Eden满了或者一个Survivor满了就会触发,Survivor有两个,一个总是空的,当执行MinorGC时,Eden的数据经过GC后的数据就会移入空的
Survivor,Eden清空,而原本有数据的Survivor经过GC后,也会将剩余数据移入此Survivor,又会产生一个空的Survivor,重复迭代。
新生代:分为Eden(新建的对象都在此,如果对象过大,可能直接提升到老生代)、Survivor(经过一次MinorGC,在Eden中存活的对象,提升到Survivor,如果Survivor满了,根据JVM参数设置的次数,不足即执行MinorGC,足够了则执行提升到老年代)。
FullGC:新生代GC、老生代GC、永生代GC。
老生代:存储生命周期比较长的对象,或者比较大直接进入老生代的对象,当老生代或者永生代内存满了,就会执行FullGC,FullGC对系统的效率影响较大,尽量减少FullGC次数。
GC日志的查看:
JVM参数:-server -Xms2048m -Xmx2048m -Xmn768m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:+UseParallelOldGC
-XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\\opt\\heap.bin -Xloggc:D:\\opt\\gc.log
MinorGC:
2015-07-28T12:27:55.796+0800: 74.868: [GC [PSYoungGen: 475902K->60685K(709120K)] 475902K->60685K(2019840K), 0.0682820 secs] [Times: user=0.23 sys=0.01, real=0.07 secs]
2015-07-28T12:27:55.796+0800: 74.868:
时间
[GC
MinorGC
[PSYoungGen:
新生代使用的垃圾收集器:Parallel Scavenge
475902K
垃圾收集前,新生代使用总量
->
60685K
垃圾收集后,因为Eden为空,所以为Survivor占用量
(709120K)] 括号中是Eden和正在被占用的Survivor的总和,因为一个Survivor总要为空,所以此参数为新生代上限
475902K
垃圾收集前,Java堆总使用大小
->60685K
垃圾收集后,Java堆总使用大小
(2019840K), 0.0682820 secs]
Java堆大小
[Times: user=0.23 sys=0.01, real=0.07 secs]
垃圾回收所耗时间,user是非系统指令所耗CPU时间;sys执行系统命令CPU耗时;real是垃圾回收实际所耗时间
FullGC:
2015-07-28T12:27:55.864+0800: 74.936: [Full GC (System) [PSYoungGen: 60685K->0K(709120K)] [ParOldGen: 0K->60196K(1310720K)] 60685K->60196K(2019840K) [PSPermGen: 95215K->95066K(190592K)], 0.1949290 secs] [Times: user=0.55 sys=0.03, real=0.19 secs]
2015-07-28T12:27:55.864+0800: 74.936:时间
[Full GC (System) FullGC
[PSYoungGen: 60685K->0K(709120K)]新生代将数据提升到老生代,新生代内存使用量变化(新生代内存总量)
[ParOldGen: 0K->60196K(1310720K)] 老生代接收到新生代提升的数据,老生代内存使用了变化(老生代总量)
60685K->60196K(2019840K) Java堆内存变化(堆内存总量,为新生代和老生代总量之和)
[PSPermGen: 95215K->95066K(190592K)], 0.1949290 secs] 永久代内存变化(永久代内存总量),耗时
[Times: user=0.55 sys=0.03, real=0.19 secs] 垃圾回收所耗时间