java--jvm启动的参数
其一是标准参数(-),全部的JVM实现都必须实现这些参数的功能,并且向后兼容;
其二是非标准参数(-X),默认jvm实现这些参数的功能,可是并不保证全部jvm实现都知足,且不保证向后兼容;
其三是非Stable参数(-XX),此类参数各个jvm实现会有所不一样,未来可能会随时取消,须要慎重使用;java
• 标准参数中比较有用的:
verbose
-verbose:class
输出jvm载入类的相关信息,当jvm报告说找不到类或者类冲突时可此进行诊断。
-verbose:gc
输出每次GC的相关状况。
-verbose:jni
输出native方法调用的相关状况,通常用于诊断jni调用错误信息。算法
• 非标准参数又称为扩展参数
通常用到最多的是
-Xms512m: JVM堆内存初始值为512M。
-Xmx512m: JVM堆内存最大可用内存为512M。
-Xmn200m:设置年轻代大小为200M。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小(虚拟机中的共划分为三个代:年轻代(Young Generation)、年老点(Old Generation)和持久代(Permanent Generation)。其中持久代主要存放的是Java类的类信息,与垃圾收集要收集的Java对象关系不大。年轻代和年老代的划分是对垃圾收集影响比较大的。 )。持久代通常固定大小为64m,因此增大年轻代后,将会减少年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
年轻代:
全部新生成的对象首先都是放在年轻代的。年轻代的目标就是尽量快速的收集掉那些生命周期短的对象。年轻代分三个区。一个Eden区,两个Survivor区(通常而言)。大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当这个Survivor区满时,此区的存活对象将被复制到另一个Survivor区,当这个Survivor去也满了的时候,从第一个Survivor区复制过来的而且此时还存活的对象,将被复制“年老区(Tenured)”。须要注意,Survivor的两个区是对称的,没前后关系,因此同一个区中可能同时存在从Eden复制过来 对象,和从前一个Survivor复制过来的对象,而复制到年老区的只有从第一个Survivor去过来的对象。并且,Survivor区总有一个是空的。同时,根据程序须要,Survivor区是能够配置为多个的(多于两个),这样能够增长对象在年轻代中的存在时间,减小被放到年老代的可能。
年老代:
在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。所以,能够认为年老代中存放的都是一些生命周期较长的对象。
持久代:
用于存放静态文件,现在Java类、方法等。持久代对垃圾回收没有显著影响,可是有些应用可能动态生成或者调用一些class,例如Hibernate等,在这种时候须要设置一个比较大的持久代空间来存放这些运行过程当中新增的类。持久代大小经过-XX:MaxPermSize=<N>进行设置。
Scavenge GC
通常状况下,当新对象生成,而且在Eden申请空间失败时,就会触发Scavenge GC,对Eden区域进行GC,清除非存活对象,而且把尚且存活的对象移动到Survivor区。而后整理Survivor的两个区。这种方式的GC是对年轻代的Eden区进行,不会影响到年老代。由于大部分对象都是从Eden区开始的,同时Eden区不会分配的很大,因此Eden区的GC会频繁进行。于是,通常在这里须要使用速度快、效率高的算法,使Eden去能尽快空闲出来。
Full GC
对整个堆进行整理,包括Young、Tenured和Perm。Full GC由于须要对整个对进行回收,因此比Scavenge GC要慢,所以应该尽量减小Full GC的次数。在对JVM调优的过程当中,很大一部分工做就是对于FullGC的调节。有以下缘由可能致使Full GC:
· 年老代(Tenured)被写满
· 持久代(Perm)被写满
· System.gc()被显示调用
·上一次GC以后Heap的各域分配策略动态变化数据库
-Xss128k:设置每一个线程的堆栈大小。JDK5.0之后每一个线程堆栈大小为1M,之前每一个线程堆栈大小为256K。根据应用的线程所需内存大小进行调整。在相同物理内存下,减少这个值能生成更多的线程。可是操做系统对一个进程内的线程数仍是有限制的,不能无限生成,经验值在3000~5000左右。
-Xloggc:file
与-verbose:gc功能相似,只是将每次GC事件的相关状况记录到一个文件中,文件的位置最好在本地,以免网络的潜在问题。
若与verbose命令同时出如今命令行中,则以-Xloggc为准。
-Xprof
跟踪正运行的程序,并将跟踪数据在标准输出输出;适合于开发环境调试。
• 非Stable参数
用-XX做为前缀的参数列表在jvm中多是不健壮的,SUN也不推荐使用,后续可能会在没有通知的状况下就直接取消了;可是因为这些参数中的确有不少是对咱们颇有用的,好比咱们常常会见到的-XX:PermSize、-XX:MaxPermSize等等;编程
首先来介绍行为参数:ruby
参数及其默认值 描述
-XX:-DisableExplicitGC 禁止调用System.gc();但jvm的gc仍然有效
-XX:+MaxFDLimit 最大化文件描述符的数量限制
-XX:+ScavengeBeforeFullGC 新生代GC优先于Full GC执行
-XX:+UseGCOverheadLimit 在抛出OOM以前限制jvm耗费在GC上的时间比例
-XX:-UseConcMarkSweepGC 对老生代采用并发标记交换算法进行GC
-XX:-UseParallelGC 启用并行GC
-XX:-UseParallelOldGC 对Full GC启用并行,当-XX:-UseParallelGC启用时该项自动启用
-XX:-UseSerialGC 启用串行GC
-XX:+UseThreadPriorities 启用本地线程优先级
-XX:+ ParallelGCThreads JVM在进行并行GC的时候,用于GC的线程数服务器
上面表格中黑体的三个参数表明着jvm中GC执行的三种方式,即串行、并行、并发;
串行(SerialGC)是jvm的默认GC方式,通常适用于小型应用和单处理器,算法比较简单,GC效率也较高,但可能会给应用带来停顿;
并行(ParallelGC)是指GC运行时,对应用程序运行没有影响,GC和app二者的线程在并发执行,这样能够最大限度不影响app的运行;
并发(ConcMarkSweepGC)是指多个线程并发执行GC,通常适用于多处理器系统中,能够提升GC的效率,但算法复杂,系统消耗较大;网络
性能调优参数列表:并发
参数及其默认值 描述
-XX:LargePageSizeInBytes=4m 设置用于Java堆的大页面尺寸
-XX:MaxHeapFreeRatio=70 GC后java堆中空闲量占的最大比例
-XX:MaxNewSize=size 新生成对象能占用内存的最大值
-XX:MaxPermSize=64m 老生代对象能占用内存的最大值
-XX:MinHeapFreeRatio=40 GC后java堆中空闲量占的最小比例
-XX:NewRatio=2 新生代内存容量与老生代内存容量的比例
-XX:NewSize=2.125m 新生代对象生成时占用内存的默认值
-XX:ReservedCodeCacheSize=32m 保留代码占用的内存容量
-XX:ThreadStackSize=512 设置线程栈大小,若为0则使用系统默认值
-XX:+UseLargePages 使用大页面内存
-XX:+UseCompressedOops 能够压缩指针,起到节约内存占用的新参数oracle
咱们在平常性能调优中基本上都会用到以上黑体的这几个属性; app
调试参数列表:
参数及其默认值 描述
-XX:-CITime 打印消耗在JIT编译的时间
-XX:ErrorFile=./hs_err_pid<pid>.log 保存错误日志或者数据到文件中
-XX:-ExtendedDTraceProbes 开启solaris特有的dtrace探针
-XX:- TraceClassUnloading 用来打印类被加载和卸载的过程信息,这个用来诊断应用的内存泄漏问题很是有用
-XX:HeapDumpPath=./java_pid<pid>.hprof 指定导出堆信息时的路径或文件名
-XX:-HeapDumpOnOutOfMemoryError 当首次遭遇OOM时导出此时堆中相关信息
-XX:OnError="<cmd args>;<cmd args>" 出现致命ERROR以后运行自定义命令
-XX:OnOutOfMemoryError="<cmd args>;<cmd args>" 当首次遭遇OOM时执行自定义命令
-XX:-PrintClassHistogram 遇到Ctrl-Break后打印类实例的柱状信息,与jmap -histo功能相同
-XX:-PrintConcurrentLocks 遇到Ctrl-Break后打印并发锁的相关信息,与jstack -l功能相同
-XX:-PrintCommandLineFlags 打印在命令行中出现过的标记
-XX:-PrintCompilation 当一个方法被编译时打印相关信息
-XX:-PrintGC 每次GC时打印相关信息
-XX:-PrintGCDetails 每次GC时打印详细信息
-XX:-PrintGCTimeStamps 打印每次GC的时间戳
-XX:- PrintGCDateStamps 打印每次GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:-TraceClassLoading 跟踪类的加载信息
-XX:-TraceClassLoadingPreorder 跟踪被引用到的全部类的加载信息
-XX:-TraceCla***esolution 跟踪常量池
-XX:-TraceClassUnloading 跟踪类的卸载信息
-XX:-TraceLoaderConstraints 跟踪类加载器约束的相关信息
-XX:- UseGCLogFileRotation 启用GC日志文件的自动转储
-XX:- NumberOfGCLogFiles GC日志文件的循环数目
-XX:- GCLogFileSize 控制GC日志文件的大小
jboss启动配置参数
-c, –configuration=<name> Set the server configuration name
-b, –host=<host or ip> Bind address for all JBoss services
-g, –partition=<name> HA Partition name集群的名称(default=DefaultDomain)
-u, –udp=<ip> UDP multicast address集群内节点交互的多播地址
-D<name>[=<value>] Set a system property 参数-D设置系统属性jboss.messaging.ServerPeerId的值,JBoss消息须要这个值在群中要求惟一
JMX(Java Management Extensions,即Java管理扩展)-Dcom.sun.management.jmxremote.ssl=false #enable ssl connection (true / false)#禁止ssl链接-Dcom.sun.management.jmxremote.authenticate=true #connection authenticate (true / false)#开启用户认证-Djava.rmi.server.hostname #multi eth choose (ip / domain)#指定hostname 通常状况须要从新指定hostname,不然链接不成功-Dcom.sun.management.jmxremote.port #jmx connection remote port#指定hostname 指定端口默认:1099-Dcom.sun.management.jmxremote.access.file #remote access roles (file path) #访问模式-Dcom.sun.management.jmxremote.password.file #remote authenticate file when authenticate enable (file path)#认证用户名密码注意:jmxremote.password和jmxremote.access文件只容许启动用户名对该文件拥有读写权限,咱们服务用appsup启动 因此:[appsup@ukoclntrtap01u ~]$ ll /usr/java/default/jre/lib/management/total 28-rw-r--r--. 1 appsup users 3998 Dec 19 2014 jmxremote.access-rw-------. 1 appsup users 2854 Jun 13 11:18 jmxremote.password若是权限设置不正确会报错:Error: Password file read access must be restricted-Djava.endorsed.dirs#能够简单理解为-Djava.endorsed.dirs指定的目录里面放置jar文件,将有覆盖系统API的功能。能够牵强的理解为,将本身修改后的API打入到虚拟机指定的启动API中,取而代之。可是可以覆盖的类是有限制的,其中不包括java.lang包中的类-classpath #参数为目录下全部jar文件-Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000#指定rmi调用时gc的时间间隔#rmi是Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序能够调用远程服务器上的对象。远程方法调用特性使Java编程人员可以在网络环境中分布操做。RMI所有的宗旨就是尽量简化远程接口对象的使用。-Djava.awt.headless=true#Headless模式是系统的一种配置模式。在该模式下,系统缺乏了显示设备、键盘或鼠标。-Dsun.lang.ClassLoader.allowArraySyntax=true#(This property is needed to workaround for the bug 6434149 for JAVA 1.6 ) as it won't work without it.#原来jdk5.0的时候不会报这个错java.lang.ClassNotFoundException: [Ljava.lang.String,用了jdk6.0就出现了这个错误,由于没有重载java.lang.String这个类-Doracle.net.tns_admin#设置JVM的oracle.net.tns_admin的system propertyOracle中TNS的完整定义:transparence Network Substrate透明网络底层,监听服务是它重要的一部分,不是所有,不要把TNS看成只是监听器。TNS是Oracle Net的一部分,专门用来管理和配置Oracle数据库和客户端链接的一个工具,在大多数状况下客户端和数据库要通信,必须配置TNS,固然在少数状况下,不用配置TNS也能够链接Oracle数据库,好比经过JDBC。若是经过TNS链接Oracle,那么客户端必须安装Oracle client程序。Oracle当中,若是想访问某个服务器,必需要设置TNS,它不像SQL SERVER那样在客户端自动列举出在局域网内全部的在线服务器,只需在客户端选择须要的服务器,而后使用账号与密码登陆便可。而Oracle不能自动列举出网内的服务器,须要经过读取TNS配置文件才能列出通过配置的服务器名。配置文件名通常为:tnsnames.ora,默认路径:%ORACLE_HOME%\network\admin\tnsnames.ora-java.net.preferIPv4Stack (default: false)#If IPv6 is available on the operating system the underlying native socketwill be an IPv6 socket. This allows Java(tm) applications to connect too, andaccept connections from, both IPv4 and IPv6 hosts.If an application has a preference to only use IPv4 sockets then thisproperty can be set to true. The implication is that the application will not beable to communicate with IPv6 hosts.-Djboss.platform.mbeanserver 让JBoss EAP 使用jdk的mbean serverMBean一般是一个java类,它提供接口可使这个类具备管理功能(如standard MBean,接口中定义的方法使MBean具备管理功能)。MBeanServer是管理MBean的一个java类,你须要向MBean server注册一个MBean后,这个MBean才会具备管理功能,MBean server还提供了查询功能和注册监听器的功能,sun提供的只是接口,不一样的jmx实现中的MBean server实现也不一样。MBeanServer是一个包含全部注册MBean的仓库.它是JMX代理层的核心.JMX1.0规范提供一个接口叫 javax.management.MBeanServer. 全部管理的在MBean操做经过MBeanServer执行.使用MBeanServer实例,你可以管理全部MBean.每个MBean具备一个惟一标志,叫ObjectName.-Djavax.management.builder.initial=org.jboss.system.server.jmx.MBeanServerBuilderImpl若是是jboss 4.x,在jvm启动参数中加入-Djboss.platform.mbeanserver就能够了.对于jboss eap 5.x,因为其基于jboss as 5.1,还须要这个参数-Djavax.management.builder.initial=org.jboss.system.server.jmx.MBeanServerBuilderImpl不然启动就报一堆异常。-javaagent:/opt/appoptics/appoptics-agent.jar #会在main方法以前预先执行premain方法Agent 类必须打成jar包,而后里面的 META-INF/MAINIFEST.MF 必须包含 Premain-Class这个属性-Dorg.jboss.resolver.warning=true This option warns when an XML entity is defined as SYSTEM with protocol is not "file://" or "vfsfile://", which is most likely something not expected.-org.jboss.Main#run.sh中的参数org.jboss.Main-Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n -Xrunjdwp#This option loads the JPDA reference implementation of JDWP. This library resides in the target VM and uses JVMDI and JNI to interact with it. It uses a transport and the JDWP protocol to communicate with a separate debugger application.dt_socket:使用的通讯方式server:是主动链接调试器仍是做为服务器等待调试器链接suspend:是否在启动JVM时就暂停,并等待调试器链接address:地址和端口,地址能够省略,二者用冒号分隔-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005#JVM 1.5之后的版本应该使用相似上面的命令(老的仍是可使用的),就是一个agentlib就好了,后面的参数都没有变-Djboss.modules.system.pkgs=org.jboss.byteman#This complicates matters for integration with other javaagents which alter the script because this property must also be set and it is not defined in the JVM what precedence is given to multiple same property settings on the command line.-Djboss.modules.policy-permissions=true#The Java Security Manager must be enabled for the JBoss application server.-jaxpmodule javax.xml.jaxp-provider org.jboss.as.standalone#JAXP(Java API for XMLProcessing,意为XML处理的Java API)是Java XML程序设计的应用程序接口之一,它提供解析和验证XML文档的能力。-Djruby.native.enabled=false#关闭Ruby-Djava.library.path=/bin/native#指定非java类包的位置(如:dll,so)