All Products
Search
Document Center

Container Service for Kubernetes:Kumpulkan dump heap JVM secara otomatis saat keluar tidak normal menggunakan CNFS

Last Updated:Nov 11, 2025

Jika aplikasi Anda dikembangkan dalam Java dan ruang heap JVM diatur terlalu kecil, masalah kehabisan memori (OOM) dapat terjadi. Anda dapat menggunakan Container Network File System (CNFS) sebagai media pencatatan log dengan memasangnya ke direktori yang sesuai di dalam kontainer. Saat terjadi OOM pada JVM, CNFS dapat menyimpan log ke direktori tersebut. Topik ini menjelaskan cara menggunakan CNFS untuk mengumpulkan dump heap JVM secara otomatis saat keluar tidak normal.

Prasyarat

Pertimbangan

  • Nilai heap maksimum (Xmx) yang diatur untuk Java harus lebih kecil daripada batas memori Pod untuk mencegah Pod mengalami OOM sebelum JVM melakukannya.

  • Saat menggunakan dump heap Java, kami menyarankan membuat CNFS baru dan memisahkan CNFS yang digunakan untuk operasi bisnis dari CNFS yang digunakan untuk dump heap Java. Hal ini mencegah file .hprof menjadi terlalu besar dan mengonsumsi sumber daya bisnis berlebihan selama proses dump, yang dapat memengaruhi operasi bisnis.

  • Citra docker.io/filebrowser/filebrowser:v2.18.0 yang digunakan dalam contoh mungkin gagal ditarik karena pembatasan akses jaringan. Anda perlu menyinkronkannya ke instans ACR Edisi Perusahaan Anda dengan cara berlangganan citra dari luar Tiongkok. Konfigurasi spesifiknya adalah sebagai berikut:

    • Artifact Source: Docker Hub

    • Source Repository Coordinates: filebrowser/filebrowser

    • Subscription Policy: v2.18.0

      Setelah menyelesaikan langganan citra, Anda perlu mengonfigurasi kebijakan tarik tanpa kata sandi antara instans ACR Edisi Perusahaan dan kluster ACK. Untuk informasi selengkapnya, lihat Tarik citra dari akun yang sama.

Prosedur

  1. Gunakan citra contoh registry.cn-hangzhou.aliyuncs.com/acs1/java-oom-test:v1.0 sebagai program Java untuk mensimulasikan OOM dan memicu OOM JVM.

  2. Gunakan contoh berikut untuk membuat Penyebaran bernama java-application.

    Dalam contoh ini, saat memulai program Java Mycode, ukuran heap yang diminta diatur menjadi 80 MB, dan direktori dump heap adalah /mnt/oom/logs. Saat ukuran heap JVM tidak mencukupi, kesalahan HeapDumpOnOutOfMemoryError akan ditangkap.

    cat << EOF | kubectl apply -f -
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: java-application
    spec:
      selector:
        matchLabels:
          app: java-application
      template:
        metadata:
          labels:
            app: java-application
        spec:
          containers:
          - name: java-application
            image: registry.cn-hangzhou.aliyuncs.com/acs1/java-oom-test:v1.0  #Alamat citra program contoh dalam topik ini.
            imagePullPolicy: Always
            env:                               #Definisikan dua pasangan kunci-nilai: POD_NAME sebagai metadata.name dan POD_NAMESPACE sebagai metadata.namespace.
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.name
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.namespace
            args:
            - java                            #Perintah eksekusi.
            - -Xms80m                         #Nilai heap minimum untuk memori heap.
            - -Xmx80m                         #Nilai heap maksimum untuk memori heap.
            - -XX:HeapDumpPath=/mnt/oom/logs  #Jalur untuk dump memori heap saat terjadi OOM.
            - -XX:+HeapDumpOnOutOfMemoryError #Tangkap kesalahan OOM heap.
            - Mycode                          #Program yang dieksekusi.
            volumeMounts:
            - name: java-oom-pv
              mountPath: "/mnt/oom/logs"      #Gunakan /mnt/oom/logs sebagai direktori pemasangan di dalam kontainer.
              subPathExpr: $(POD_NAMESPACE).$(POD_NAME)   #Gunakan $(POD_NAMESPACE).$(POD_NAME) sebagai subdirektori yang dibuat untuk menghasilkan file dump OOM di subdirektori tersebut.
          volumes:
          - name: java-oom-pv
            persistentVolumeClaim:
              claimName: cnfs-nas-pvc         #Gunakan PVC CNFS bernama cnfs-nas-pvc.
    ---
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: cnfs-nas-pvc
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: alibabacloud-cnfs-nas
      resources:
        requests:
          storage: 70Gi # Jika fitur kuota direktori diaktifkan, bidang storage berlaku, dan jumlah maksimum data yang dapat ditulis ke direktori yang dibuat secara dinamis adalah 70 GiB.
    ---          
    EOF
  3. Melalui Pusat Insiden di Konsol Container Service, Anda dapat melihat bahwa Pod memiliki event peringatan Back-off restarting, yang menunjukkan bahwa aplikasi java-application mengalami OOM.

    1. Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.

    2. Pada halaman Clusters, temukan kluster yang diinginkan dan klik namanya. Di panel kiri, pilih Operations > Event Center.

    3. Lihat event yang sesuai.

      3e0492283c067026c9cfd348a898ecb1

  4. Karena NAS saat ini tidak memiliki fungsi untuk menelusuri, mengunggah, atau mengunduh file, Anda dapat menggunakan File Browser sebagai alat akses berbasis web. Pertama, pasang titik pemasangan NAS ke rootDir File Browser, lalu buat Layanan untuk memetakan port kontainer File Browser, dan akhirnya akses file yang disimpan di NAS melalui browser.

    1. Gunakan templat berikut untuk membuat Penyebaran File Browser dan ConfigMap yang diperlukan oleh File Browser, dengan port 80 diaktifkan secara default.

      cat << EOF | kubectl apply -f -
      apiVersion: v1
      data:
        .filebrowser.json: |
          {
            "port": 80,
            "address": "0.0.0.0"
          }
      kind: ConfigMap
      metadata:
        labels:
          app.kubernetes.io/instance: filebrowser
          app.kubernetes.io/name: filebrowser
        name: filebrowser
        namespace: default
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        labels:
          app.kubernetes.io/instance: filebrowser
          app.kubernetes.io/name: filebrowser
        name: filebrowser
        namespace: default
      spec:
        progressDeadlineSeconds: 600
        replicas: 1
        revisionHistoryLimit: 10
        selector:
          matchLabels:
            app.kubernetes.io/instance: filebrowser
            app.kubernetes.io/name: filebrowser
        template:
          metadata:
            labels:
              app.kubernetes.io/instance: filebrowser
              app.kubernetes.io/name: filebrowser
          spec:
            containers:
            - image:  XXXX-registry-vpc.cn-hangzhou.cr.aliyuncs.com/test/test:v2.18.0  #Citra contoh docker.io/filebrowser/filebrowser:v2.18.0 mungkin gagal ditarik karena pembatasan akses jaringan. Lihat bagian pertimbangan.
              imagePullPolicy: IfNotPresent
              name: filebrowser
              ports:
              - containerPort: 80
                name: http
                protocol: TCP
              resources: {}
              securityContext: {}
              terminationMessagePath: /dev/termination-log
              terminationMessagePolicy: File
              volumeMounts:
              - mountPath: /.filebrowser.json
                name: config
                subPath: .filebrowser.json
              - mountPath: /db
                name: rootdir
              - mountPath: /rootdir
                name: rootdir
            dnsPolicy: ClusterFirst
            restartPolicy: Always
            schedulerName: default-scheduler
            securityContext: {}
            terminationGracePeriodSeconds: 30
            volumes:
            - configMap:
                defaultMode: 420
                name: filebrowser
              name: config
            - name: rootdir
              persistentVolumeClaim:
                claimName: cnfs-nas-pvc
      EOF

      Keluaran yang diharapkan:

      configmap/filebrowser unchanged
      deployment.apps/filebrowser configured
    2. Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.

    3. Pada halaman Clusters, temukan kluster yang diinginkan dan klik namanya. Di panel kiri, pilih Network > Services.

    4. Pada halaman Services, pilih namespace default, klik Create, lalu konfigurasikan parameter berikut.

      Parameter

      Contoh deskripsi

      Service Name

      filebrowser

      Service Type

      Server Load Balancer (LoadBalancer)

      • Load Balancer Type: Classic Load Balancer (CLB)

      • Pilih Create Resource, klik daftar drop-down Create CLB Resource, atur Access Method ke Internet Access, dan atur Billing Method ke Pay-as-you-go.

      Untuk informasi tentang penagihan CLB, lihat Ikhtisar penagihan CLB.

      Service Association

      Pilih +Reference Workload Label.

      • Resource Type: Deployments

      • Resource List: filebrowser

      Port Mapping

      • Service Port: 8080

      • Container Port: 80

      • Protocol: TCP

    5. Dalam kotak dialog, pilih Server Load Balancer (LoadBalancer) sebagai jenis layanan. Pilih Create Resource, atur Access Method ke Internet Access, atur Billing Method ke Pay-as-you-go (PayByCLCU), dan kirimkan perubahan konfigurasi sesuai petunjuk.

      Untuk informasi tentang penagihan CLB, lihat Ikhtisar penagihan CLB.
    6. Buka browser Anda dan masukkan alamat titik akhir:8080 di bilah alamat. Anda akan melihat antarmuka login File Browser. Masukkan akun default (admin) dan kata sandi (admin) untuk mengakses interior kontainer.

      20fe4dcde1759ebc64cbe0b1bb3168da

    7. Karena File Browser memasang PVC bernama cnfs-nas-pvc ke rootDir, klik ganda rootDir untuk memasuki titik pemasangan NAS.

      image

Hasil

Di File Browser, Anda dapat melihat direktori bernama default.java-application-76d8cd95b7-prrl2. Direktori ini dihasilkan oleh aturan java-application's subPathExpr: $(POD_NAMESPACE).$(POD_NAME).

image

Kemudian masuk ke direktori ini untuk melihat file dump java_pid1.hprof di dalam direktori tersebut. Untuk menemukan baris kode tempat terjadinya OOM dalam program Anda, Anda dapat mengunduh java_pid1.hprof ke mesin lokal Anda dan menganalisis lebih lanjut informasi stack JVM menggunakan MAT (Eclipse Memory Analyzer Tools).

lQLPJxMFSGyoLcnNAqTNB2awoAbbe3-kh8AIV2X4pMttAA_1894_676