由于 Java 堆空间问题,Micronaut 服务器启动失败

问题描述 投票:0回答:1

我有一个启动 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

从 pod 的使用来看,它只使用了大约 434mb

有人知道吗?谢谢!

kubernetes cron micronaut
1个回答
0
投票

问题通常是默认情况下只有 25% 的可用内存可供堆空间使用。在我们的项目中,我们默认使用以下

JAVA_TOOL_OPTIONS
设置。

如果您在此更改后仍然遇到 OOM,则需要增加内存限制或尝试使用更高的

MaxRAMPercentage
值。

    env:
    - name: JAVA_TOOL_OPTIONS
      value: "-XX:InitialRAMPercentage=15 -XX:MaxRAMPercentage=50"

旁注:对于一些没有任何 OOM 问题的应用程序,我们通过上述设置体验到了显着的性能提升。

© www.soinside.com 2019 - 2024. All rights reserved.