基于Docker等容器方式运行Java应用时,容器的资源管理使用了操作系统cgroup机制,但是JVM无法感知cgroup。

也就是说在没有UseContainerSupport参数支持的JDK版本中,JVM是无法感知容器环境存在,对容器资源的限制比如内存或者cpu等都无法生效。在这种情况下,如果JVM申请的内存大于容器的内存,容器就会把当前进程kill掉,所以必须要让JVM感知到能使用的最大内存,这样可以及时进行GC。

UseContainerSupport作用

为了支持JVM感知cgroup的内存限制,在JDK1.8的8u91版本之后引入了 默认开启 的UseContainerSupport参数。

另外,由于容器内存管理方式的出现,仅仅通过Xmx、Xms参数来配置JVM中堆内存的方式无法很好地适配通过容器内存调整来管理JVM内存大小。

所以JVM还提供了 MaxRAMPercentage,InitialRAMPercentage,MinRAMPercentage 三个参数,这三个参数用途是 指定JVM堆内存的相对容器内存的占比 。通过控制容器内存大小就能实现动态控制JVM内存大小,例如容器分配4G,如果MaxRAMPercentage设置为75.0则JVM最大堆内存为4*0.75即3G,如果要提升JVM堆内存大小只需要调整容器内存即可。

一般来说MaxRAMPercentage MinRAMPercentage参数可以配置为75.0或80.0。

-XX:+UseContainerSupport
-XX:MaxRAMPercentage=75.0
-XX:InitialRAMPercentage=75.0
-XX:MinRAMPercentage=75.0

小伙伴们,瑞幸前创始人做的库迪咖啡新用户首单1块钱喝咖啡啦,扫码自取!不爱喝咖啡的也可以试试库可冰系列!

基于Docker等容器方式运行Java应用时,容器的资源管理使用了操作系统cgroup机制,但是JVM无法感知cgroup。也就是说在没有UseContainerSupport参数支持的JDK版本中,JVM是无法感知容器环境存在,对容器资源的限制比如内存或者cpu等都无法生效。在这种情况下,如果JVM申请的内存大于容器的内存,容器就会把当前进程kill掉,所以必须要让JVM感知到能使用的最大内存,这样可以及时进行GC。UseContainerSupport作用为了支持JVM感知cgroup..
应用出现OutOfMemory等内存异常,应用中有使用本地缓存且占用大量内存空间,系统吞吐量与响应性能不高或不降,Heap内存(老年代)持续上涨达到设置的最大内存值,Full GC 次数频繁。等有解决方法 JVM调优 主要是针对垃圾收集器的收集性能优化
优化容器尺寸的技术和工具(例如,jlink,Project Port ola) 缩短应用程序启动时间的方法(例如CDS) 使用Graal SubstrateVM进行AOT(提前)编译的好处 最新的OpenJDK增强功能改善了JVM与 Docker 等之间的交互。 参加本次... 1. java 8的介绍: Java 8是2014年3月份发布的,到现在已经四年多的时间了,今天让我们来学习下 java 8, Java 8主要新增了如下内容: 1) Lambda 表达式 2) 函数式接口 3)方法引用与构造器引用 4)强大的 Stream API 5) 接口中的默认方法与静态方法 6)新增时间日期 API 7) 其他新特性 2. Java 8的优点: 1)速度更快 2)代码更少(使用...
如果容器资源没有设置任何 limits 并且 Java 没有设置额外 参数 的话, Java 应用会默认使用宿主机 1/4 的内存作为 MaxHeapSize ,可通过如下命令验证: $ docker run --rm -ti 129.0.4.40/common/jdk:8 java -XX:+PrintFlagsFinal -version | grep MaxHeapSize
Java 应用容器化虽然更好地解决了可移植性问题,但也存在着一些不友好的情况,比如低版本的JDK(低于 Java 8u131)并不能识别 CGroup资源限制。这将导致JVM读取的是宿主机的全部CPU和内存,一但容器使用资源超过限制则会被 docker 杀死。 在 kubernetes 中,我们会显示在 yaml 文件中配置CPU、内存请求和限制,我们希望容器中的JVM进程能够自动识别到 CGroup 资源限制,获取到正确的内存和CPU信息从而自行动态调整。 JVM 参数 配置 以下操作皆在一台 4C 16G
-Xmn是 jvm调优 参数 之一,用于设置年轻代的大小。年轻代是 Java 堆内存中的一部分,用于存放新创建的对象。当年轻代满了之后,会触发垃圾回收机制进行清理。因此,设置合适的年轻代大小可以提高垃圾回收的效率,从而提高程序的性能。 下面是一个设置-Xmn 参数 的例子: ```shell java -Xms512m -Xmx1024m -Xmn256m -jar myapp.jar 这个命令将会启动一个 Java 应用程序,并设置初始堆大小为512MB,最大堆大小为1024MB,年轻代大小为256MB。 需要注意的是,设置-Xmn 参数 时需要根据具体情况进行调整。如果年轻代太小,会导致频繁的垃圾回收,从而影响程序的性能;如果年轻代太大,会导致老年代的空间变小,从而增加Full GC的时间和频率。