标签:内存 java arch ati nop 垃圾收集器 permgen zed nts
如果在META-INF/MANIFEST.MF
文件里面设置了Main-Class
属性,那么你就可以很方便的通过java -classpath myapp.jar Main
命令甚至更简洁的java -jar myapp.jar
命令,来启动java虚拟机。这些命令会使用默认的设置来启动JVM。
要想看到JVM执行时使用在使用哪些参数以及其各参数默认值,可以使用这个命令:
java -XX:+PrintFlagsFinal -version
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
bool PrintHeapAtGC = false {product rw}
bool PrintHeapAtGCExtended = false {product rw}
...
uintx AdaptiveSizeDecrementScaleFactor = 4 {product}
uintx AdaptiveSizeMajorGCDecayTimeScale = 10 {product}
uintx AdaptiveSizePausePolicy = 0 {product}
...
bool UseCompressedOops := true {lp64_product}
...
bool UseXmmRegToRegMoveAll = true {ARCH product}
bool VMThreadHintNoPreempt = false {product}
intx VMThreadPriority = -1 {product}
intx VMThreadStackSize = 1024 {pd product}
intx ValueMapInitialSize = 11 {C1 product}
intx ValueMapMaxLoopSize = 8 {C1 product}
intx ValueSearchLimit = 1000 {C2 product}
bool VerifyMergedCPBytecodes = true {product}
...
|
如果这些参数还不够全,你可以打开几个开关:
java -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions -XX:+PrintFlagsFinal -version
大部分的参数都可以安全的看到默认值,但是某些参数需要在生产环境运行时来调整。
(后面花括号里面有product的表示可以在启动参数中设置的,花括号里面是“product rw”的表示你还可以在jvm启动后使用类似下面的命令来设置这些参数)
jinfo -flag -PrintHeapAtGC=true <pid>
对java应用而言,最基本的设置莫过于java堆大小的初始值和最大值设置了(一般认为生产环境初始值和最大值设置成一样的比较合适)。
如果你使用的java7或者更早版本的jdk,你可能发现“OutOfMemoryError: PermGen space”,这时你需要使用-XX:MaxPermSize=<size>参数来增大Perm区大小。server虚拟机默认的Perm区大小是64M,但很多应用所需的Perm区空间不止64M。
如果JVM虚拟机耗尽了堆空间,且GC垃圾回收不了时,会抛出“java.lang.OutOfMemoryError:Java heap space”,要分析内存占用情况,可以添加参数-XX:+HeapDumpOnOutOfMemoryError参数,这个参数会在抛出java.lang.OutOfMemoryError异常时,dump堆空间的数据到当前工作目录下的一个文件中,-XX:HeapDumpPath=<path>可以指定这个dump文件的具体位置
垃圾回收策略有很多,这里不细说,可以参考Java Garbage Collection Distilled。
不管你正在使用那一个垃圾收集器,你都可以用日志的方式记录一段事件的垃圾回收的过程,来观察垃圾回收的效果。你可以添加参数-verbose:gc来把垃圾回收日志输出到标准输出(STDOUT),但更好的方式是通过参数-Xloggc:<pathtofile>把垃圾回收日志输出到指定的文件。
同时添加-XX:+PrintGCDateStamps参数可以记录下垃圾回收的时间戳,添加-XX:+PrintGCDetails可以记录下垃圾回收的事件细节。
默认情况下,垃圾回收日志文件不断变大,但JVM还内置支持回转日志文件(rotating the file),可搭配使用这三个参数:
-XX:+UseGCLogFileRotation 开启回转日志文件
-XX:GCLogFileSize=8K 设置单个文件最大的文件大小
-XX:NumberOfGCLogFiles=1 设置回转日志文件的个数
最后,你可能需要使用-XX:+DisableExplicitGC参数来显性的关闭手动GC功能(即调用jdk的建议GC的api:System.gc()),让System.gc()方法变成一个空方法,让垃圾回收托管给JVM的垃圾收集器。
java -Xms10g -Xmx10g -XX:MaxPermSize=256m -XX:+HeapDumpOnOutOfMemoryError -XX:+DisableExplicitGC -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:/var/log/myapp/gc.log -XX:+UseGCLogFileRotation -XX:GCLogFileSize=10M -XX:NumberOfGCLogFiles=20 -jar myapp.jar
这个例子使虚拟机分配10GB内存和256MB给perm区(java7)。内存溢出时dump堆空间的共鞥启动了,使用G1(garbage first)垃圾收集器,垃圾收集日志记录到/var/log/myapp/gc.log中,同时开启了日志文件回转功能。
原创文章:【译】JVM的默认参数,转载请注明:转载自戎码一生
标签:内存 java arch ati nop 垃圾收集器 permgen zed nts
原文地址:http://www.cnblogs.com/feelgood/p/6396864.html