我有一个启动 Micronaut 应用程序的 Kubernetes Cronjob。然而,似乎应用程序在初始化期间由于 java 堆空间而失败。我开始失去想法,因为它不应该在 init 上使用那么多内存,我什至尝试根据要求设置 2GB 内存。
这是 Micronaut 启动时的错误日志
[logger=io.micronaut.runtime.Micronaut] - Error starting Micronaut server: Java heap space
java.lang.OutOfMemoryError: Java heap space
at java.base/java.util.Arrays.copyOfRange(Arrays.java:3822)
at java.base/java.lang.String.<init>(String.java:529)
at java.base/java.lang.String.<init>(String.java:487)
at com.mysql.cj.util.StringUtils.toString(StringUtils.java:1368)
at com.mysql.cj.result.StringValueFactory.createFromBytes(StringValueFactory.java:139)
at com.mysql.cj.result.StringValueFactory.createFromBytes(StringValueFactory.java:47)
at com.mysql.cj.protocol.a.MysqlTextValueDecoder.decodeByteArray(MysqlTextValueDecoder.java:143)
at com.mysql.cj.protocol.result.AbstractResultsetRow.decodeAndCreateReturnValue(AbstractResultsetRow.java:135)
at com.mysql.cj.protocol.result.AbstractResultsetRow.getValueFromBytes(AbstractResultsetRow.java:243)
at com.mysql.cj.protocol.a.result.ByteArrayRow.getValue(ByteArrayRow.java:91)
at com.mysql.cj.jdbc.result.ResultSetImpl.getString(ResultSetImpl.java:883)
at com.mysql.cj.jdbc.result.ResultSetImpl.getString(ResultSetImpl.java:896)
at com.zaxxer.hikari.pool.HikariProxyResultSet.getString(HikariProxyResultSet.java)
at org.hibernate.type.descriptor.sql.VarcharTypeDescriptor$2.doExtract(VarcharTypeDescriptor.java:62)
at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:47)
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:257)
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:253)
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:243)
at org.hibernate.type.AbstractStandardBasicType.hydrate(AbstractStandardBasicType.java:329)
at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:3214)
at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1887)
at org.hibernate.loader.Loader.hydrateEntityState(Loader.java:1811)
at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1784)
at org.hibernate.loader.Loader.getRow(Loader.java:1624)
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:748)
at org.hibernate.loader.Loader.getRowsFromResultSet(Loader.java:1047)
at org.hibernate.loader.Loader.processResultSet(Loader.java:998)
at org.hibernate.loader.Loader.doQuery(Loader.java:967)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:357)
at org.hibernate.loader.Loader.doList(Loader.java:2868)
at org.hibernate.loader.Loader.doList(Loader.java:2850)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2682)
这里是 cronjob 配置
apiVersion: v1
kind: Pod
metadata:
annotations:
kubernetes.io/psp: eks.privileged
creationTimestamp: "2023-03-03T02:00:00Z"
generateName: id-stg1-cesauthservice-cold-storage-27963480-
labels:
controller-uid: 3e8d6839-ed3a-4cfc-9416-de071b8214d2
job-name: id-stg1-cesauthservice-cold-storage-27963480
job-type: ColdStorageJob
name: id-stg1-cesauthservice-cold-storage-27963480-l5f2p
namespace: id-stg1
ownerReferences:
- apiVersion: batch/v1
blockOwnerDeletion: true
controller: true
kind: Job
name: id-stg1-cesauthservice-cold-storage-27963480
uid: 3e8d6839-ed3a-4cfc-9416-de071b8214d2
resourceVersion: "112311974"
uid: 8a4d0a88-5ba7-444b-bdd6-6f1b0652d03e
spec:
containers:
- env:
- name: mode
value: cronjob
- name: cron_job_type
value: ColdStorageJob
envFrom:
- configMapRef:
name: id-stg1-cesauthservice-cronjob
- secretRef:
name: id-stg1-cesauthservice-cronjob
image: 992063009675.dkr.ecr.us-east-1.amazonaws.com/cesauth-service:r23.2.1-4aa7313-5908
imagePullPolicy: Always
name: cesauthservice
ports:
- containerPort: 8080
name: http
protocol: TCP
resources:
limits:
memory: 1536Mi
requests:
cpu: 100m
memory: 1536Mi
securityContext: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: kube-api-access-hjspn
readOnly: true
有人知道吗?谢谢!
问题通常是默认情况下只有 25% 的可用内存可供堆空间使用。在我们的项目中,我们默认使用以下
JAVA_TOOL_OPTIONS
设置。
如果您在此更改后仍然遇到 OOM,则需要增加内存限制或尝试使用更高的
MaxRAMPercentage
值。
env:
- name: JAVA_TOOL_OPTIONS
value: "-XX:InitialRAMPercentage=15 -XX:MaxRAMPercentage=50"
旁注:对于一些没有任何 OOM 问题的应用程序,我们通过上述设置体验到了显着的性能提升。