一、JVM内存区域划分
jvm区域总体分两类
heap区
Eden Space(伊甸园)、Survivor Space(幸存者区)、Tenured Gen(老年代-养老区)
非heap区
Code Cache(代码缓存区)、Perm Gen(永久代)、Jvm Stack(java虚拟机栈)、Local Method Statck(本地方法栈)
Sun JVM的内存管理采用分代的策略
年轻代(Young Gen):年轻代主要存放新创建的对象
年轻代分成1个Eden Space和2个Suvivor Space
年老代(Tenured Gen):年老代主要存放JVM认为生命周期比较长的对象
持久代(Perm Gen):持久代主要存放类定义、字节码和常量等很少会变更的信息
JVM -XX:NewRatio、-XX:SurvivorRatio参数含义
堆大小 = 年轻代 + 老年代
JVM内存大小=年轻代大小 + 年老代大小 + 持久代大小
Runtime.maxMemory() = OldGen + NewGen - Survivor
-xx:NewRatio:
年轻代(eden+2*survivor)和年老代(不含永久区)的比值
4 表示 年轻代 :年老代=1 :4,即新生代占堆的1/5
-xx:SurvivorRatio
设置两个Survivor区和eden的比
8表示 两个Survivor:eden = 2:8,即一个Survivor占年轻代的1/10
/opt/taobao/java/bin/java -server
-Xms4g 最小堆的大小, 也就是当你的虚拟机启动后, 就会分配这么大的堆内存给你
-Xmx4g 是最大堆的大小
-Xmn2g 设置年轻代大小为2G。整个JVM内存大小=年轻代大小 + 年老代大小 + 持久代大小,正常情况下,Runtime.maxMemory() = OldGen + NewGen - Survivor
-XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=512m
-XX:MaxDirectMemorySize=1g
-XX:SurvivorRatio=10
-XX:+UseConcMarkSweepGC
-XX:CMSMaxAbortablePrecleanTime=5000
-XX:+CMSClassUnloadingEnabled
-XX:CMSInitiatingOccupancyFraction=80
-XX:+UseCMSInitiatingOccupancyOnly
-XX:+ExplicitGCInvokesConcurrent
-Dsun.rmi.dgc.server.gcInterval=2592000000
-Dsun.rmi.dgc.client.gcInterval=2592000000
-XX:ParallelGCThreads=2
-Xloggc:/home/admin/logs/gc.log
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/home/admin/logs/java.hprof
-Djava.awt.headless=true -Dsun.net.client.defaultConnectTimeout=10000
-Dsun.net.client.defaultReadTimeout=30000
-DJM.LOG.PATH=/home/admin/logs
-DJM.SNAPSHOT.PATH=/home/admin/snapshots
-Dfile.encoding=UTF-8
-Dhsf.publish.delayed=true
-Dproject.name=ssp-wiki
-Dpandora.boot.wait=true
-Dlog4j.defaultInitOverride=true
-Dserver.port=7001
-Dmanagement.port=7002
-Dmanagement.server.port=7002
-javaagent:/home/staragent/plugins/codecoverage/local_data/cc-agent.jar=output=tcpserver,address=127.0.0.1,port=47653
-Dpandora.location=/home/admin/ssp-wiki/target/taobao-hsf.sar
-classpath /home/admin/ssp-wiki/target/ssp-wiki
-Dapp.location=/home/admin/ssp-wiki/target/ssp-wiki
-Djava.endorsed.dirs=
-Djava.io.tmpdir=/home/admin/ssp-wiki/.default/temp com.taobao.pandora.boot.loader.SarLauncher
新生代存储段生命周期短的实例对象,老年代存储生命周期较长的实例对象。YGC又称为Minor GC。我们当前使用的JVM设置的都是CMS垃圾策略,这里采用的标记-复制-清除算法。新生代的垃圾回收为YGC的管理范围.老年代Perm的垃圾回收为FGC的管辖范围。
各个区所占用内存多少有JVM参数来指定:
-Xmx2g 堆所占最大内存2g
-Xms2g 堆最小内存2g
-Xmn1024m 新生代(
new
区)1024M
-XX:PermSize=128m perm区128M
-XX:SurvivorRatio=
5
新生代中eden:Survivor1=
5
:
1
并且Survivor1:Survivor2=
1
,此值默认为
8
(这里有IBM调研报告,Java程序在运行过程中
80
%的对象实例是朝生夕死的)
-XX:MaxTenuringThreshold=
15
对象晋升老年代年龄条件
15
次(默认值
15
)
-XX:+UseCMSCompactAtFullCollection jvm在FullGC之后整理内存空间清除碎片
-XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -
jmap 能查看jvm内存中,对象占用内存的情况,还提供非常方便的命令将jvm的内存信息导出的文件。
format=b是通过二进制的意思,-dump:format=b,file=heap.bin意思是:把内存结构全部dump到二进制文件heap.bin中。
执行命令:jhat -J-Xmx512m heap.bin ,(ha指IBM的HeapAnalyzer)