Java VM 启动参数详解
Java VM 启动参数详解
@Date 2017.05.24
打印输出相关参数
-verbose
- 打印加载类的详细信息
-verbose:gc
- 打印虚拟机中GC的详细情况:显示最忙和最空闲收集行为发生的时间、收集前后的内存大小、收集需要的时间等
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/admin/logs/java.hprof
- 虚拟机在出现内存溢出异常时Dump 出当前的内存堆转储快照
-XX:+TraceClassLoading
- 打印加载类的详细信息
-XX:+PrintGCDetails
- 详细了解GC中的变化
-XX:+PrintGCDateStamps
- 了解垃圾收集发生的时间,自JVM启动以后以秒计量
-Xloggc:/home/admin/logs/gc.log
- GC日志文件的路径
涉及堆相关的参数
-server
- server模式下,新生代选择的是并行GC,旧生代选择的是并行GC
- client模式下,新生代选择的是串行GC,旧生代选择的是串行GC
-Xms2g
- 堆的初始值2g
-Xmx2g
- 堆的最大值2g
- PS:避免在运行时频繁调整Heap的大小,通常-Xms与-Xmx的值设成一样
-XX:MinHeapFreeRation=
- 空余堆内存小于MinHeapFreeRation时,JVM会增大Heap到-Xmx指定的大小
-XX:MaxHeapFreeRation=
- 空余堆内存大于MaxHeapFreeRation时,JVM会减小heap的大小到-Xms指定的大小
-Xmn1g
- 新生代堆大小1G
-XX:SurvivorRatio=8
- 默认32:1:1
- 新生代的Eden区:From区:To区的比例为8:1:1
-XX:PermSize= (JDK7)
- 永久代大小
-XX:MaxPermSize= (JDK7)
- 永久代MAX大小
-XX:MetaspaceSize= (JDK8)
- 代替PermSize,元空间大小
-XX:MaxMetaspaceSize= (JDK8)
- 代替MaxPermSize,元空间最大值
回收算法
标记-清理
- 直接清理
- 效率高
- 产生内存碎片
标记-复制
- 两块内存区域,S1,S2
- 不存在内存碎片
- 占用双倍空间
标记-整理
- 在标记-清理之后,让剩余存活的对象都向一端移动,并更新引用其对象的指针
- 效率低
- 不产生碎片
分代收集算法
- 把Java堆分新生代和老年代
- 在新生代用复制算法
- 在老年代用标记-清理或标记-整理算法
垃圾清理类型
-XX:+UseSerialGC
- Serial GC
- 串行
- 使用简单的标记、清除、压缩方法对年轻代和年老代进行垃圾回收,即Minor GC和Major GC
- 适用于CPU配置较低,内存占用较少的单独Client应用模式
-XX:+UseParallelGC
- Parallel GC
- 并行
- 收集方式同Serial GC一样
- 产生N个线程来进行年轻代的垃圾收集
- N默认=系统CPU核数
-XX:ParallelGCThreads=
- 设置Parallel GC线程数量
-XX:+UseParallelOldGC
- Parallel Old GC
- 方式同Parallel GC
- 主要是年轻代和年老代垃圾回收时都使用多线程收集
-XX:+UseConcMarkSweepGC
- 并发标记清除(CMS)收集器
- 短暂停顿并发收集器
- CMS-initial-mark:初始标记阶段(stop the world)
- CMS-concurrent-mark : 和应用线程并发执行,标记可达的对象
- CMS-concurrent-preclean(CMS-concurrent-preclean-start,CMS-concurrent-preclean) : 预清理(标记和应用线程是并发执行的,有些对象的状态在标记后会改变)
- CMS-concurrent-abortable-preclean : 进一步的预清理,减少Rescan阶段时间.使用到参数(-XX:CMSMaxAbortablePrecleanTime)
- Rescan阶段(stop the world) : 暂停应用线程,对对象进行重新扫描并标记
- CMS-concurrent-sweep : 并发的垃圾清理
- CMS-concurrent-reset : 下一次CMS GC重置相关数据结构
- 对年老代进行垃圾收集
- 年轻代使用的算法和Parallel一样
- 适用于不能忍受长时间停顿要求快速响应的应用
- !!!FULL GC
- concurrent-mode-failure : CMS GC时,有新的对象要进入年老代,但是年老代空间不足
- promotion-failed : Young GC时,存活对象从Eden区到Survivor区,但是Survivor区空间不足,需要到年老代,年老代空间也不足
-XX:CMSMaxAbortablePrecleanTime=
- CMS GC在concurrent-abortable-preclean阶段使用的参数
- 当abortable-preclean阶段执行达到这个时间时才会结束
-XX:+CMSClassUnloadingEnabled
- 避免Perm区满引起的Full GC,开启CMS回收Perm区
-XX:CMSInitiatingOccupancyFraction=
- 此参数值是一个比例(参考下一条)
-XX:+UseCMSInitiatingOccupancyOnly
- 如果设置了此参数
- 只有当年老代占用达到了-XX:CMSInitiatingOccupancyFraction参数所设定的比例时才会触发CMS
-XX:ParallelCMSThreads=
- 设置CMS收集器的线程数量
-XX:+UseG1GC
- G1垃圾收集器
- 属于分代收集器
- JDK7+,长远目标时代替CMS收集器
- 并行的、并发的和增量式压缩短暂停顿的垃圾收集器
- 缩短处理超大堆时产生的停顿
- 相对于CMS的优势而言是内存碎片的产生率大大降低
- G1收集器和其他的收集器运行方式不一样,不区分年轻代和年老代.它把堆空间划分为多个大小相等的区域,当进行垃圾收集时,它会优先收集存活对象较少的区域
- 采用Remembered Set来避免全堆扫描
-XX:MaxGCPauseMillis=200
- 设置GC的最大暂停时间为200ms
- 如果MaxGCPauseMillis设置的过小,那么GC就会频繁,吞吐量就会下降
- 如果MaxGCPauseMillis设置的过大,应用程序暂停时间就会变长
-XX:G1HeapRegionSize=
- 设置的G1区域的大小
- 值是2的幂,范围是1MB到32MB之间
-Dsun.rmi.dgc.server.gcInterval=2592000000
-Dsun.rmi.dgc.client.gcInterval=2592000000
- 存在RMI调用时,默认会每分钟执行一次System.gc,可以通过此参数来设置大点的间隔
堆外内存相关参数
-XX:MaxDirectMemorySize=
- 指定了DirectByteBuffer分配空间限额
- DirectByteBuffer通过内存映射,使Java应用进程直接访问与文件相关联的虚拟地址空间,减少了文件拷贝带来的开销,提高了文件读取效率
- 默认会调用Full GC来回收
-XX:+DisableExplicitGC
- 禁用Full GC显示调用(禁用System.GC)
- 会出现OOM: 当系统各方面性能良好,无Full GC且DirectByteBuffer所占用的空间大于-Xmx分配的空间.
因为DirectByteBuffer会不断地在Native堆分配空间,它的引用进入了Old区,Old区保存大量的引用,而不能被回收,最终会导致Native堆空间不足 - 可以通过设置-XX:MaxDirectMemorySize=几十M,使OOM来得更早一些
-XX:+ExplicitGCInvokesConcurrent
- 使用此参数,在进行堆外内存Full GC时,使用CMS并发GC,减少单纯的Full GC的卡顿时间,提高GC效率
other options
-Dsun.net.client.defaultConnectTimeout=10000
-Dsun.net.client.defaultReadTimeout=30000
- 设置默认的Http请求的连接超时时间和读取超时时间
-Dfile.encoding=UTF-8
- 设置文件流编码
-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n
- 开放8000端口,支持远程DEBUG
SpringBoot启动参数样例
机器配置4核8G
java -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -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=4 -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 -Dfile.encoding=UTF-8
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
一次线上Java应用内存泄漏分析实例
由于JVM的内存管理采用GC垃圾自动回收机制,这使得Java程序员在编程的时候确实可以从内存管理中释放出来,但这也引发了另外一个大问题,一旦Java应用出现内存泄漏的时候,常常让人措手不及,陷入无从下手的尴尬境地,我们总不能一句话重启吧(苦笑)。 内存问题可能是大多数Java程序员心中都曾有过的伤,因为太容易遇见了。 下面这篇文章是我去年写在个人微信公众号上的,今天早上回头再看心中不免有些嘘嘘感慨,于是决定重新整理把它发到简书上来,以下为正文: 前2天负责的一个线上系统在早上9点20分接到大量用户反馈系统很卡,页面无响应。我联系运维及时查看后台服务器,发现WAS(Websphere) server bin目录下生成了javacore 和heapdump,这个消息让我整个人都不好了,项目推广关键时期居然来这么一出,可谓多事之秋,搞事情啊! 好吧,既然程序运行时遇到了坑,那我们就先来找到这个坑,再把坑填好(围笑)。 简单介绍下,线上应用运行在power linux OS平台之上,web容器为IBM WebSphere ,JDK ibm j9vm 64 位。 首先开始通过ibm ha456....
- 下一篇
Java动态代理
Java动态代理 @Date 2016.11.24 静态代理 提前创建一个代理类,实现和业务逻辑同样的接口 传递业务实现类的对象,在调用业务方法前后可以做代理的逻辑 扩展原有功能,不侵入原有代码 如果需要代理的业务类变多,并且实现方法不一样的情况下,对应的代理类会增多 Java本身动态代理 只能代理接口 实现java.lang.reflect.InvocationHandler接口 通过Proxy.newProxyInstance (obj.getClass().getClassLoader(),obj.getClass().getInterfaces(), InvocationHandler invocationHandler);创建代理类 虚拟机自动调用invoke方法 cglib动态代理 运行期间动态生成Java字节码 不用实现接口,直接底层生成代理类覆盖父类中的方法 实现MethodInterceptor接口的intercept方法 调用重写方法比JDK本身的代理速度快 加载cglib耗时比JDK本身的时间长 不适合反复动态生成新的代理类
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- 设置Eclipse缩进为4个空格,增强代码规范
- Mario游戏-低调大师作品
- MySQL8.0.19开启GTID主从同步CentOS8
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS8编译安装MySQL8.0.19
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS关闭SELinux安全模块