JVM内存的推荐配置说明和实践

JVM堆的各个区大小分配比例遵循一些基本原则

1、Java整个堆大小设置,Xmx和 Xms设置为老年代存活对象的3-4即FullGC之后的老年代内存占用的3-4倍

2、年轻代Xmn设置为老年代存活对象的1-1.5

3、老年代的内存大小设置为老年代存活对象的2-3

4、永久代 PermSizeMaxPermSize设置为老年代存活对象的1.2-1.5

另:

1、Sun官方建议年轻代的大小为整个堆的3/8左右, 所以按照上述设置的方式,基本符合Sun的建议。 

2堆大小=年轻代大小+年老代大小, 即xmx=xmn+老年代大小。Permsize不影响堆大小

3、为什么要按照上面的来进行设置呢?没有具体的说明,但应该是根据多种调优之后得出的一个结论。

根据上面的说明,列举一些JVM堆内存在k8s上的实际配置以下参数配置适用于非计算密集型的大部分应用

Docker实例内存为2G时:

-Xmx1344M -Xms1344M -Xmn448M -XX:MaxMetaspaceSize=192M -XX:MetaspaceSize=192M

Docker实例内存为3G时:

-Xmx2048M -Xms2048M -Xmn768M -XX:MaxMetaspaceSize=256M -XX:MetaspaceSize=256M

Docker实例内存为4G时:

-Xmx2688M -Xms2688M -Xmn960M -XX:MaxMetaspaceSize=256M -XX:MetaspaceSize=256M

Docker实例内存为5G时:

-Xmx3392M -Xms3392M -Xmn1216M -XX:MaxMetaspaceSize=512M -XX:MetaspaceSize=512M

Docker实例内存为6G时:

-Xmx4096M -Xms4096M -Xmn1536M -XX:MaxMetaspaceSize=512M -XX:MetaspaceSize=512M

Docker实例内存为7G时:

-Xmx4736M -Xms4736M -Xmn1728M -XX:MaxMetaspaceSize=512M -XX:MetaspaceSize=512M

Docker实例内存为8G时:

-Xmx5440M -Xms5440M -XX:MaxMetaspaceSize=512M -XX:MetaspaceSize=512M

其它的基础配置参数

实例内存>=8G

-server-XX:+DisableExplicitGC-XX:+UseG1GC-XX:MaxGCPauseMillis=100-XX:+ParallelRefProcEnabled-XX:+HeapDumpOnOutOfMemoryError-XX:+PrintGCDetails-XX:+PrintGCTimeStamps-XX:+PrintHeapAtGC-XX:+PrintGCApplicationStoppedTime-XX:+PrintGCDateStamps-XX:ErrorFile=/var/app/gc/hs_err_pid%p.log-XX:HeapDumpPath=/var/app/gc-Xloggc:/var/app/gc/gc%t.log

实例内存<8G时的基础配置

-server-XX:+DisableExplicitGC-XX:+UseParNewGC-XX:+UseConcMarkSweepGC-XX:+UseCMSInitiatingOccupancyOnly-XX:CMSInitiatingOccupancyFraction=70-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses-XX:+CMSClassUnloadingEnabled-XX:+ParallelRefProcEnabled-XX:+CMSScavengeBeforeRemark-XX:+HeapDumpOnOutOfMemoryError-XX:+PrintGCDetails-XX:+PrintGCTimeStamps-XX:+PrintHeapAtGC-XX:+PrintGCApplicationStoppedTime-XX:+PrintGCDateStamps-XX:ErrorFile=/var/app/gc/hs_err_pid%p.log-XX:HeapDumpPath=/var/app/gc-Xloggc:/var/app/gc/gc%t.log

http://dockone.io/article/2249

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
前 言   致 谢   第一部分 走近Java   第1章 走近Java / 2   1.1 概述 / 2   1.2 Java技术体系 / 3   1.3 Java发展史 / 5   1.4 展望Java技术的未来 / 9   1.4.1 模块化 / 9   1.4.2 混合语言 / 9   1.4.3 多核并行 / 11   1.4.4 进一步丰富语法 / 12   1.4.5 64位虚拟机 / 13   1.5 实战:自己编译JDK / 13   1.5.1 获取JDK源码 / 13   1.5.2 系统需求 / 14   1.5.3 构建编译环境 / 15   1.5.4 准备依赖项 / 17   1.5.5 进行编译 / 18   1.6 本章小结 / 21   第二部分 自动内存管理机制   第2章 Java内存区域与内存溢出异常 / 24   2.1 概述 / 24   2.2 运行时数据区域 / 25   2.2.1 程序计数器 / 25   2.2.2 Java虚拟机栈 / 26   2.2.3 本地方法栈 / 27   2.2.4 Java堆 / 27   2.2.5 方法区 / 28   2.2.6 运行时常量池 / 29   2.2.7 直接内存 / 29   2.3 对象访问 / 30   2.4 实战:OutOfMemoryError异常 / 32   2.4.1 Java堆溢出 / 32   2.4.2 虚拟机栈和本地方法栈溢出 / 35   2.4.3 运行时常量池溢出 / 38   2.4.4 方法区溢出 / 39   2.4.5 本机直接内存溢出 / 41   2.5 本章小结 / 42   第3章 垃圾收集器与内存分配策略 / 43   3.1 概述 / 43   3.2 对象已死? / 44   3.2.1 引用计数算法 / 44   3.2.2 根搜索算法 / 46   3.2.3 再谈引用 / 47   3.2.4 生存还是死亡? / 48   3.2.5 回收方法区 / 50   3.3 垃圾收集算法 / 51   3.3.1 标记 -清除算法 / 51   3.3.2 复制算法 / 52   3.3.3 标记-整理算法 / 54   3.3.4 分代收集算法 / 54   3.4 垃圾收集器 / 55   3.4.1 Serial收集器 / 56   3.4.2 ParNew收集器 / 57   3.4.3 Parallel Scavenge收集器 / 59   3.4.4 Serial Old收集器 / 60   3.4.5 Parallel Old收集器 / 61   3.4.6 CMS收集器 / 61   3.4.7 G1收集器 / 64   3.4.8 垃圾收集器参数总结 / 64   3.5 内存分配与回收策略 / 65   3.5.1 对象优先在Eden分配 / 66   3.5.2 大对象直接进入老年代 / 68   3.5.3 长期存活的对象将进入老年代 / 69   3.5.4 动态对象年龄判定 / 71   3.5.5 空间分配担保 / 73   3.6 本章小结 / 75   第4章 虚拟机性能监控与故障处理工具 / 76   4.1 概述 / 76   4.2 JDK的命令行工具 / 76   4.2.1 jps:虚拟机进程状况工具 / 79   4.2.2 jstat:虚拟机统计信息监视工具 / 80   4.2.3 jinfo:Java配置信息工具 / 82   4.2.4 jmap:Java内存映像工具 / 82   4.2.5 jhat:虚拟机堆转储快照分析工具 / 84   4.2.6 jstack:Java堆栈跟踪工具 / 85   4.3 JDK的可视化工具 / 87   4.3.1 JConsole:Java监视与管理控制台 / 88   4.3.2 VisualVM:多合一故障处理工具 / 96   4.4 本章小结 / 105   第5章 调优案例分析与实战 / 106   5.1 概述 / 106   5.2 案例分析 / 106   5.2.1 高性能硬件上的程序部署策略 / 106   5.2.2 集群间同步导致的内存溢出 / 109   5.2.3 堆外内存导致的溢出错误 / 110   5.2.4 外部命令导致系统缓慢 / 112   5.2.5 服务器JVM进程崩溃 / 113   5.3 实战:Eclipse运行速度调优 / 114   5.3.1 调优前的程序运行状态 / 114   5.3.2 升级JDK 1.6的性能变化及兼容问题 / 117   5.3.3 编译时间和类加载时间的优化 / 122   5.3.4 调
以下是JDK8 JVM配置的最佳实践: 1. 堆内存大小设置:应该根据应用程序的需求和场景来设置堆内存大小。设置过小会导致OutOfMemoryError,设置过大会浪费系统资源。一般建议将堆内存设置在物理内存的一半到三分之二之间。 2. 新生代和老年代的比例设置:新生代和老年代的比例设置对垃圾回收的性能影响很大。一般建议将新生代和老年代的比例设置为1:2或1:3。 3. 垃圾回收器的选择:JDK8提供了G1垃圾回收器和CMS垃圾回收器两种选择。G1适用于大堆内存和多核CPU,而CMS适用于低延迟场景。应该根据应用程序的需求来选择合适的垃圾回收器。 4. 线程数设置:JVM的垃圾回收器是多线程的,线程数的设置会影响垃圾回收的性能。一般建议将线程数设置为CPU核数的一半到三分之二之间。 5. 元空间大小设置:JDK8中使用元空间代替了永久代。元空间的大小应该根据应用程序的需求和场景来设置,一般建议将元空间设置为物理内存的十分之一。 6. GC日志设置:GC日志可以帮助我们分析和优化垃圾回收的性能。可以通过设置-XX:+PrintGC和-XX:+PrintGCDetails参数来输出GC日志。 7. 调整参数:还可以调整一些其他参数来优化JVM的性能,例如关闭Java应用程序的本地内存分配、调整JIT编译器的参数等。 需要注意的是,JDK8 JVM配置的最佳实践是根据应用程序的需求和场景来确定的,需要进行实验和测试来确定最佳的配置方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值