zoukankan      html  css  js  c++  java
  • 如何写出禁止GC发生的Java代码

    #! /bin/bash
    
    echo """
    package com.example;
    
    public class DisableGC {
        static native void acquire(int[] arr);
    
        static native void release(int[] arr);
    
        public static void main(String... args) throws Throwable {
            System.loadLibrary("disablegc");
            int[] arr = new int[]{1,2};
            acquire(arr);
            System.out.println("[Acquire]");
            for(int i=0;i<1000;i++){
              int[] tmp = new int[1024*1024*50];
              System.out.println(tmp);
            }
            System.out.println("[Release]");
            release(arr);
        }
    }
    """ > DisableGC.java
    
    $JAVA_HOME/bin/javac -h . DisableGC.java
    
    echo """
    #include "com_example_DisableGC.h"
    
    static jintArray sink;
    
    JNIEXPORT void JNICALL Java_com_example_DisableGC_acquire
      (JNIEnv *env, jclass klass, jintArray arr) {
      sink = (jintArray)(*env)->GetPrimitiveArrayCritical(env, arr, 0);
    }
    
    JNIEXPORT void JNICALL Java_com_example_DisableGC_release
      (JNIEnv *env, jclass klass, jintArray arr){
      (*env)->ReleasePrimitiveArrayCritical(env, arr, sink, 0);
    }
    """ > com_example_DisableGC.c
    
    gcc  -I${JAVA_HOME}/include/linux -I${JAVA_HOME}/include -shared com_example_DisableGC.c -o libdisablegc.so
    
    mkdir -p com/example/
    mv DisableGC.class com/example/
    OPT="-XX:+UseParallelGC -Xlog:gc* -Xmx1g -Xms1g -Djava.library.path="$(pwd)
    $JAVA_HOME/bin/java $OPT com.example.DisableGC
    

    小trick,用的是JNI GetPrimitiveArrayCritical/ReleasePrimitiveArrayCritical,底层是GCLocker。跑一下脚本,结果符合预期:

    $./disable_gc.sh
    [0.007s][info][gc] Using Parallel
    [0.007s][info][gc,heap,coops] Heap address: 0x00000000c0000000, size: 1024 MB, Compressed Oops mode: 32-bit
    [Acquire]
    [I@5fdef03a
    [I@3b22cdd0
    [I@1e81f4dc
    [I@4d591d15
    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    	at com.example.DisableGC.main(DisableGC.java:15)
    [0.535s][info][gc,heap,exit ] Heap
    [0.535s][info][gc,heap,exit ]  PSYoungGen      total 305664K, used 225772K [0x00000000eab00000, 0x0000000100000000, 0x0000000100000000)
    [0.535s][info][gc,heap,exit ]   eden space 262144K, 86% used [0x00000000eab00000,0x00000000f877b070,0x00000000fab00000)
    [0.535s][info][gc,heap,exit ]   from space 43520K, 0% used [0x00000000fd580000,0x00000000fd580000,0x0000000100000000)
    [0.535s][info][gc,heap,exit ]   to   space 43520K, 0% used [0x00000000fab00000,0x00000000fab00000,0x00000000fd580000)
    [0.535s][info][gc,heap,exit ]  ParOldGen       total 699392K, used 614400K [0x00000000c0000000, 0x00000000eab00000, 0x00000000eab00000)
    [0.535s][info][gc,heap,exit ]   object space 699392K, 87% used [0x00000000c0000000,0x00000000e5800030,0x00000000eab00000)
    [0.535s][info][gc,heap,exit ]  Metaspace       used 3807K, capacity 4486K, committed 4864K, reserved 1056768K
    [0.535s][info][gc,heap,exit ]   class space    used 339K, capacity 386K, committed 512K, reserved 1048576K
    

    HAVE FUN!

  • 相关阅读:
    销售人员个人提升经典书籍推荐
    销售必看的书籍推荐
    我在公司敲代码,你却在家和老王………————程序员的那些梗
    某程序员动了公司的祖传代码"屎山",半年后怒交辞职报告!
    为什么说程序员的前三年不要太看重工资水平?
    好的员工关系应该是怎样的?
    粒子群优化算法(PSO)python 3实现
    Python基础篇-安装python
    Python设置matplotlib.plot的坐标轴刻度间隔以及刻度范围
    空TreeList添加节点不显示
  • 原文地址:https://www.cnblogs.com/kelthuzadx/p/14419730.html
Copyright © 2011-2022 走看看