您的位置:首页 > 编程语言 > Java开发

也学习Java/JVM/GC (二)

2016-09-22 16:42 232 查看

二、JVM的堆结构及参数配置

对于开发人员来说,最多接触的就是程序启动参数的设置。
程序的启动参数对系统具有至关重要的影响。其中包含堆大小的设置、年轻代大小、年老代大小,
Perm区等大小,以及垃圾回收算法,年轻代的垃圾回收算法,年老代垃圾回收算法等。


1、JVM的堆结构如下图所示:



从上图可见,JVM的堆分为eden、s0、s1、old generation和perm五个部分。
新创建的对象会被分配到eden区域,当eden区域满后会触发ygc,将对象复制到S0区,
S1中存活的对象也会复制到S0区。始终保持一个survivor区域为空,持续此过程。
年老代存放的是年轻代survivor满后触发ygc后仍然存活的对象。当eden区满后,会将对象存放到survivor中,
如果内存分配在新生代没有足够空间时,直接在年老代分配,当年老代没有足够的空间时会报OutOfMemoryException。
perm是存储程序类结构,静态变量等的容器。


2、JVM参数设置

标准参数:

-client:
以client模式启动JVM,在32位机器上使用。64位机器上忽略此参数。

-server:
以server模式启动JVM。

-agentlib:*libname*[*=options*]:
根据名字加载本地库,例如:
-agentlib:hprof
-agentlib:jdwp=help

-agentpath:*pathname*[*=options*]:
根据路径加载本地库。
-classpath *classpath*
-cp *classpath*
声明目录、文件和压缩包的列表来寻找类文件。
classpath使用“:”分割(windows使用“;”分割)。声明-classpath或-cp会覆盖环境变量的CLASSPATH的设置。
如果没有使用-classpath和-cp,并且没有设置CLASSPATH,类路径会默认使用当前目录;
-Dproperty=*value*
设置系统属性值
-d32
在32位的环境中运行应用。如果没有安装32位的环境或者不支持32位的环境就会报错。
-d64
运行在64位的环境中。如果使用了-client 参数会忽略-d64这个参数。
-disableassertions[:*package name* "..." | :*class name*]
-da[:*package name* "..." | :*class name*]
禁用断言,默认开启。
-enableassertions[:*package name* "..." | :*class name*]
-ea[:*package name* "..." | :*class name*]
开启断言,默认关闭。
-enablesystemassertions
-esa
为系统类开启断言(设置系统类默认开启断言)。
-disablesystemassertions
-dsa
禁止系统类断言
-help or -?
显示帮助信息并退出
-jar
执行包装在jar文件中的程序。第一个参数是jar文件的名称。想要这个选项起作用,
JAR文件中的描述文件必须包含一行主类文件名字(*classname*)。主类文件名字中必须有main的静态启动方法。
-javaagent:jarpath[=*options*]
加载java程序语言代理。
-showversion
展示jvm版本,通-version.
-verbose
-verbose:class
这是加载的每个类信息。
-verbose:gc
报告每次gc时间的信息。
-verbose:jni
报告本地方法信息,


行为参数

-XX:-AllowUserSignalHandlers
允许为java程序安装信号处理器。
-XX:AltStackSize=16384
更改信号栈大小。
-XX:-DisableExplicitGC
禁止在程序中调用System.gc()。
-XX:+FailOverToOldVerifier
当类型校验失败时,回到老的方式校验。
-XX:+RelaxAccessControlCheck
在校验器中放松对访问控制的检查。
-XX:+ScavengeBeforeFullGC
使ygc优先于fgc。
-XX:+UseConcMarkSweepGC
为年老代使用并行标记交换垃圾回收。
-XX:+UseGCOverheadLimit
使用一项政策,限制的花在 GC 引发内存不足的错误之前的 VM 的时间比例。
-XX:-UseParallelGC
使用并行垃圾收集进行清理。
-XX:-UseParallelOldGC
为fgc设置并行垃圾收集器。
-XX:-UseSerialGC
使用串行GC。


性能参数

-Xmnsize or -XX:NewSize
设置年青代大小
-Xmsn
设置堆的初始化大小
-Xmxn
设置堆的最大值
-Xprof
配置文件正在运行的程序,并分析数据发送到标准输出。此选项使用在开发环境。
-Xssn
设置线程栈大小。
-XX:MaxGCPauseMillis=*n*
设置GC暂停的最大时间。
-XX:CompileThreshold=10000
通过JIT编译器,将方法编译成机器码的阀值,可以理解为调用方法的次数
-XX:LargePageSizeInBytes=4m
为java堆设置最大页大小
-XX:MaxHeapFreeRatio=70
GC后,当JVM堆使用率大于70%时进行扩张。
-XX:MaxNewSize=size
新生代的最大值。
-XX:MaxPermSize=64m
年老代的最大值。
-XX:MinHeapFreeRatio=40
GC后,当JVM使用率小于40%进行收缩。
-XX:NewRation=2
新生代和年老代的比率。
2代表着 新生代/年老代=1/2.
-XX:NewSize=2m
默认新生代的大小。
-XX:SurvivorRatio=8
eden和survivor的比率。8代表着suivivor和eden的比率为8:1(2个survivor)。
-XX:TargetSurvivorRation=50
survivor空间使用占比。
-XX:ThreadStackSize=512
线程栈的大小。
-XX:UseBiasedLocking
开启偏向锁。
-XX:+UseFastAccessorMethods
使用优化过的原生类型get
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jvm 开发人员