2.所有在-vmargs之后的参数将会被传输给JVM,所有如果所有对Eclipse 设置的参数必须写在-vmargs之前.
-vmargs [Java VM arguments]
描述:指定启动时要使用的Java虚拟机参数 . 注:此参数一定要放在所有参数变量的最后面
JVM 核心组成部分:
堆(Heap)和非堆(Non-heap)内存
按照官方的说法:“Java虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中。
堆(Heap)结构
Java虚拟机将堆内存划分为新生代、老年代和永久代,永久代是HotSpot虚拟机特有的概念(JDK1.8之后为metaspace替代永久代),它采用永久代的方式来实现方法区,其他的虚拟机实现没有这一概念,而且HotSpot也有取消永久代的趋势,在JDK 1.7中HotSpot已经开始了“去永久化”,把原本放在永久代的字符串常量池移出。永久代主要存放常量、类信息、静态变量等数据,与垃圾回收关系不大,新生代和老年代是垃圾回收的主要区域。
1、新生代(Young Generation)
新生成的对象优先存放在新生代中,新生代对象朝生夕死,存活率很低,在新生代中,常规应用进行一次垃圾收集一般可以回收70% ~ 95% 的空间,回收效率很高。
HotSpot将新生代划分为三块,一块较大的Eden(伊甸)空间和两块较小的Survivor(幸存者)空间,默认比例为8:1:1。划分的目的是因为HotSpot采用复制算法来回收新生代,设置这个比例是为了充分利用内存空间,减少浪费。新生成的对象在Eden区分配(大对象除外,大对象直接进入老年代),当Eden区没有足够的空间进行分配时,虚拟机将发起一次Minor
GC。
GC开始时,对象只会存在于Eden区和From
Survivor区,To Survivor区是空的(作为保留区域)。GC进行时,Eden区中所有存活的对象都会被复制到To
Survivor区,而在From
Survivor区中,仍存活的对象会根据它们的年龄值决定去向,年龄值达到年龄阀值(默认为15,新生代中的对象每熬过一轮垃圾回收,年龄值就加1,GC分代年龄存储在对象的header中)的对象会被移到老年代中,没有达到阀值的对象会被复制到To
Survivor区。接着清空Eden区和From Survivor区,新生代中存活的对象都在To Survivor区。接着, From
Survivor区和To Survivor区会交换它们的角色,也就是新的To Survivor区就是上次GC清空的From
Survivor区,新的From Survivor区就是上次GC的To Survivor区,总之,不管怎样都会保证To
Survivor区在一轮GC后是空的。GC时当To
Survivor区没有足够的空间存放上一次新生代收集下来的存活对象时,需要依赖老年代进行分配担保,将这些对象存放在老年代中。
2、老年代(Old Generationn)
在新生代中经历了多次(具体看虚拟机配置的阀值)GC后仍然存活下来的对象会进入老年代中。老年代中的对象生命周期较长,存活率比较高,在老年代中进行GC的频率相对而言较低,而且回收的速度也比较慢。
3、永久代(Permanent Generationn)
永久代存储类信息、常量、静态变量、即时编译器编译后的代码等数据,对这一区域而言,Java虚拟机规范指出可以不进行垃圾收集,一般而言不会进行垃圾回收。
堆内存分配:
JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;
JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。
默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;
空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。
因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。
非堆内存分配:
JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;
由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。
JVM内存限制(最大值)
首先JVM内存限制于实际的最大物理内存,假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制,这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制了。
设置VM参数导致程序无法启动主要有以下几种原因:
1)参数中-Xms的值大于-Xmx,或者-XX:PermSize的值大于-XX:MaxPermSize;
2) -Xmx的值和-XX:MaxPermSize的总和超过了JVM内存的最大限制,比如当前操作系统最大内存限制,或者实际的物理内存等等。
说到实际物理内存这里需要说明一点的是,如果你的内存是1024MB,但实际系统中用到的并不可能是1024MB,因为有一部分被硬件占用了。
JVM参数介绍:
1)-Xgcpolicy: 指定GC回收策略
-Xgcpolicy:< balanced | gencon | optavgpause | optthruput >
gencon:分代并发(gencon)策略(缺省)将并发标记短语与分代垃圾回收结合使用,以帮助尽量缩短在任何垃圾回收暂停中耗费的时间。该策略对许多短生命周期对象的应用程序相当有用,比如事务性应用程序。 仍在生成很大的吞吐量时,暂停时间要比利用 optthruput 策略短很多。也将减少堆分段存储。balanced: balanced 策略使用标记、清除、压缩和分代样式的垃圾回收。 禁用了并发标记阶段;使用了并发垃圾回收技术,但没有采用其他策略中实现并发标记的方式。 balanced 策略针对 Java™ 堆使用基于区域的布局。 将单独管理这些区域以减少大型堆的最大暂停时间并提高垃圾回收的效率。 该策略尝试通过匹配对象分配和生存率来避免全局回收。如果遇到了由全局垃圾回收,特别是压缩引起的应用程序暂停时间的问题,该策略可能会提高应用程序的性能。 如果正在使用具有非统一内存体系结构(NUMA)特性(x86 和仅适用于 POWER® 平台)的大型系统,均衡策略将进一步改善应用程序的吞吐量。 有关该策略的更多信息,包括何时使用该策略,请参阅均衡垃圾回收策略。
optavgpause: “针对暂停时间优化”(optavgpause) 策略使用并发标记和并发清扫阶段。暂停时间比使用 optthruput 更短,但是由于应用程序正在运行时进行了一些垃圾回收工作,所以导致应用程序吞吐量减小。 如果堆的大小很大(可以在 64 位平台上使用),请考虑是否使用该策略,因为该策略限制增加的堆大小对垃圾回收暂停时间长度的影响。 但是,如果应用程序使用了很多短生命周期对象,gencon 策略可能会提高性能.
subpool:subpool 策略已弃用,现为 optthruput 的别名。 因此,如果您使用该选项,那么其作用与 optthruput 相同。
optthruput:“针对吞吐量优化”(optthruput) 策略禁用了并发标记阶段。在全局垃圾回收期间,终止应用程序,以便延长暂停时间。该配置通常用于大堆的应用程序,高应用程序吞吐量才是主要的性能目标,而非缩短垃圾回收暂停时间。 如果应用程序不能忍受较长的垃圾回收暂停时间,请考虑使用其他策略,比如 gencon。
2) -Xmn/-Xmns/-Xmnx, Sets the initial and maximum size of the new area when using -Xgcpolicy:gencon
.在使用Xgcpolicy:gencon时,设置婴儿区域(或者young)的大小。
-Xmn 设置 最大最小值一致
-Xmns 设置婴儿区域(young or new area)的最小值
-Xmnx 设置婴儿区域(young or new area)的最大值
Restriction: If you try to set -Xmn
with either -Xmns
or -Xmnx
, the VM does not start, returning an error. -Xmn与-Xmns
或者 -Xmnx不能同时设置,否则的话JVM将无法启动,并报错。
在Gencon回收策略下,可以通过-Xmn来设置婴儿区域(Nursery或者叫young)的大小,通过-Xmo来设置长存区(tenured或者old)的大小。注意-Xmn不能和-Xmns/-Xmnx参数一起使用,-Xmo不能和-Xmos/-Xmox一起使用,否则会报错。前者就是把年轻代和长存代的大小固定了,而后两者就是设定两个部分最大最小的范围,默认情况下:
-Xmns是-Xms的25%或者64M(在JDK 5.0中默认是25%)
-Xmnx是-Xmx的25%或者64M(同上)
-Xmos是-Xmx减去-Xmns的大小
-Xmox是和-Xmx一样大
3)-XX:MaxPermSize:表示对非堆区分配的内存的最大上限。
4)
此选项使 JIT 编译器通过部分优化来运行。效果是通过缩短启动时间加快编译,但较长时间运行的应用程序可能会降低运行速度。在 AOT 编译器处于活动状态时(启用了共享类和 AOT 编译),-Xquickstart 将导致所有方法执行 AOT 编译。AOT 编译可缩短后续运行的启动时间,但可能降低较长时间运行的应用程序的性能。如果将 -Xquickstart 用于长时间运行的包含热方法的应用程序,会降低性能。 -Xquickstart 的执行会根据将来发行版的变化而相应调整。缺省情况下,禁用 -Xquickstart。指定与 -Xquickstart 完全相同的行为的另一种方法是使用 -client 选项。这两个选项可在命令行上互换使用。-Xquickstart
-vm C:Program Files....jdkjreinjavaw.exe -startup plugins/org.eclipse.equinox.launcher_1.3.200.v20160318-1642.jar --launcher.library plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.400.v20160518-1444 -install C:/../../SDP -vmargs -Dsdp.driver=RADO96-I20161214_1251 -Xquickstart -Xms512m -Xmx1536m -Xmnx64m -Xgcpolicy:gencon -Xscmx96m -Xshareclasses:name=IBMSDP_%u -XX:MaxPermSize=512M -Xcompressedrefs -Dcom.ibm.ws.management.event.max_polling_interval=1000