基于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的时间和频率。