java - 如果 java 堆内存限制与 kubernetes 中的 pod 资源限制不同,会发生什么?
问题描述
我正在使用以下配置的吊舱内运行弹簧靴。
吊舱限制:
resources:
limits:
cpu: "1"
memory: 2500Mi
requests:
cpu: "1"
memory: 2500Mi
命令参数:
spec:
containers:
- args:
- -c
- ln -sf /dev/stdout /var/log/access.log;java -Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false -Djava.security.egd=file:/dev/./urandom
-Xms1600m -Xmx1600m -XX:NewSize=420m -XX............
- 如果 java 进程达到其最大堆限制(即 1600m (Xmx1600m))会发生什么情况
- 如果 Xmx 对 Pod 内的 java 进程没有影响,则可以上到 Pod 限制权(即内存:限制部分的 2500Mi)
- 如果以上配置正确,那么我们就是在浪费900Mi的内存吧(2500-1600=900)
解决方案
-Xmx 标志仅控制 Java 堆内存,这是运行代码时可供您自己的 Java 对象使用的空间。如果你用完了,JVM 会做垃圾回收来腾出空间。如果仍然用完,则会抛出 OutOfMemoryException。
Java JVM 还在内部使用大量其他内存来加载类、JIT 编译等......因此,您需要在 Kubernetes 中允许更多内存,而不仅仅是 -Xmx 值。如果超过 Kubernetes 限制值,那么 Java 可能会崩溃。
您在上面发布的配置看起来不错。通常我会在无限制运行一段时间后通过查看 Kubernetes 内存使用图来找到这些值。
推荐阅读
- javascript - GET 请求有时在 Postman 中有效,但在 Axios 中失败
- ios - ScrollView 位置数据 / SwiftUi
- javascript - 如何在js的莫里斯折线图中显示日期而不是年份
- android - 带有“startForeground(..) 的服务仅在应用程序处于后台时才需要显示通知
- android - Android MediaDataSource 意外行为
- python - 如何使用 pandas 在 python 中读取 Excel 文件?
- javascript - React Native Expo AV - 音频不播放
- javascript - 如何重新加载 chrome://inspector android webview devtools
- python - read_excel() 函数自动将 int 转换为 float
- amazon-web-services - 在 Python 中使用 AWS DynamoDB CRUD 函数的问题