Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JVisualVM/JConsole中的System.gc()与gc按钮_Java_Memory_Garbage Collection_Heap Memory_Jconsole - Fatal编程技术网

Java JVisualVM/JConsole中的System.gc()与gc按钮

Java JVisualVM/JConsole中的System.gc()与gc按钮,java,memory,garbage-collection,heap-memory,jconsole,Java,Memory,Garbage Collection,Heap Memory,Jconsole,我目前正在测试我的处理XML模式的概念验证原型,并围绕一个非常消耗内存的树自动机外部库(我已经获得了该库的源代码)构建,我想绘制不同运行的“真实峰值”(堆)内存消耗随模式大小的增加而增加(使用的指标符合我的意图,不会影响问题),或者至少是合理的近似值 为了给出一个数量级,对于一个实际峰值为100MB的运行(我测试了它几次运行完全相同的输入/参数配置,强制使用-Xmx和-Xms的jvm内存减小值),我在线程“main”中得到异常java.lang.OutOfMemoryError:GC开销限制超过

我目前正在测试我的处理XML模式的概念验证原型,并围绕一个非常消耗内存的树自动机外部库(我已经获得了该库的源代码)构建,我想绘制不同运行的“真实峰值”(堆)内存消耗随模式大小的增加而增加(使用的指标符合我的意图,不会影响问题),或者至少是合理的近似值

为了给出一个数量级,对于一个实际峰值为100MB的运行(我测试了它几次运行完全相同的输入/参数配置,强制使用-Xmx和-Xms的jvm内存减小值),我在线程“main”中得到异常java.lang.OutOfMemoryError:GC开销限制超过了<100MB,结果稳定且可重复)它占用了大约1.1GB,这就是为什么获取实数对我来说非常重要,因为它们相差很大

我花了10天时间在网上和stackoverflow上阅读问题,我真正知道的是:

  • gc()“建议”gc运行,不会以任何方式强制它,因此不可能依靠它来检测内存使用峰值

  • 通常建议的是计算对象占用(我看到了这个项目,我尝试了,工作很好,即使它不符合我的需要),这对我来说是不可行的,因为大量内存分配是由于使用不同的方法创建了大量集合(集合、列表和映射)迭代器,调用次数非常多(就我的记忆而言,10分钟内每次运行数百万次),因此要检测所有涉及的对象并执行求和是极其困难的(我用内存消耗图在几天内调试了许多次运行,但却无法识别一个瓶颈)

  • 无法轻松获得方法的内存占用(表示为对象内存分配的峰值)

  • 事实上,我自己经历过System.gc()调用是不可靠的(例如,相同配置的不同运行,由于gc是否真的被调用,System.gc()后读取的内存不同),但当我在JVisualVM或Jconsole中按下“gc按钮”时,决不会运行gc或拒绝这样做

    所以我的问题是:调用该按钮的实现(我还没有尝试过,但就我目前所读到的内容而言,使用jconsole.jar进行调用似乎是可行的)与直接从我的代码调用System.gc()不同,从而解决了我的问题?如果没有,您如何解释该按钮的“deterministc行为”?

    到目前为止,我对给定10个递增模式大小的实际内存峰值进行了一些手动测试(对于这种测量,模式是从单个“复杂性参数”自动生成的)我绘制了预期曲线,如果我无法获得更好的解决方案,我希望将代码作为一个外部jar运行,其中-Xmx/-Xms略小于我对预期内存峰值的预测,捕获外部进程ErrorStream中的OutMemoryException,并使用增加的内存重新启动,直到完成运行d、 (如果朴素的记忆预测不够稳健,我将应用适当的机器学习技术)。我知道这不是一个优雅的解决方案,但在我的场景(学术界)中,我可以花费一些额外的时间来进行这些测量。如果你对这种暴力力量方法有其他建议或改进,你是(非常)欢迎分享

    系统信息(机器为Fedora 17,64位):

    java版本“1.7.0_04” Java(TM)SE运行时环境(build 1.7.0_04-b20) Java HotSpot(TM)64位服务器虚拟机(构建23.0-b21,混合模式)

    提前感谢,, 亚历山德罗

    1) gc()“建议”gc运行,不会以任何方式强制它,因此不可能依靠它来检测内存使用峰值

    这就是规范所说的,但是如果您使用OpenJDK或HotSpot,除非您关闭它,否则它将始终执行完整的GC

    通常建议计算对象占用的数量

    我建议使用一个商业内存分析器。我会让JVM从最大8GB开始,看看它尝试使用多少。之后,我会根据您的判断增加或减少它,看它是否需要更多或似乎没有使用它

    无法轻松获得方法的内存占用(表示为对象内存分配的峰值)

    方法使用的唯一内存在堆栈上。您可以跟踪在方法中创建的对象数量(计数、类、大小),但这些对象不属于该方法,可以在任何地方使用,即使在该方法返回后也是如此

    如果没有,您如何解释该按钮的“确定性行为”

    我会把这归因于主观分析


    理想情况下,运行JVM的内存应该是它高效运行所需的最小内存的2-3倍。试图节省成本低于1美元的几个100MB并不总是有用的

    你可以这样强迫GC

    private static void force_gc()
    {
        Object obj = new Object();
        WeakReference<Object> ref = new WeakReference<Object>(obj);
        obj = null;
        while (ref.get() != null)
        {
            Log.d(LOGTAG, "Forcing gc() ...");
            System.gc();
        }
    }
    
    private static void force_gc()
    {
    Object obj=新对象();
    WeakReference ref=新的WeakReference(obj);
    obj=null;
    while(ref.get()!=null)
    {
    d(LOGTAG,“Forcing gc()…”);
    gc();
    }
    }
    

    除此之外。。。我很想知道这个问题的答案。

    据我所知,Jconsole或任何其他工具只使用System.gc()。没有其他选择。众所周知,java告诉每个人不要依赖System.gc(),但这并不意味着它根本不起作用

    所以说到您的查询,您似乎担心为什么按下该按钮直接调用GC&仍然java说System.GC只是“建议”调用GC。我说,该按钮还调用System.gc()&它只是“建议”java尝试使用gc,java决定执行
    package ravi.tutorial.java.gc;
    
    /**
     * Just to test GC. RUn with below VM arguments.
     * 
     * -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails
     * 
     * 
     * @author ravi.k
     * 
     */
    public class TestGC {
    
        public static A a;
    
        /**
         * @param args
         * @throws InterruptedException
         */
        public static void main(String[] args) throws InterruptedException {
    
            for (int i = 0; i < 100; i++) {
                populateObjects();
                System.out.println("population done for batch: " + i);
            }
    
        }
    
        public static void populateObjects() {
            for (int i = 0; i < 100000; i++) {
                a = new A("A");
            }
            //System.gc();
        }
    
    }
    
    class A {
        String s;
    
        public A(String s) {
            this.s = s;
        }
    }
    
    population done for batch: 0
    population done for batch: 1
    population done for batch: 2
    population done for batch: 3
    population done for batch: 4
    population done for batch: 5
    population done for batch: 6
    population done for batch: 7
    population done for batch: 8
    population done for batch: 9
    0.332: [GC 0.332: [ParNew: 17024K->410K(19136K), 0.0024479 secs] 17024K->410K(83008K), 0.0025219 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] 
    population done for batch: 10
    population done for batch: 11
    population done for batch: 12
    population done for batch: 13
    population done for batch: 14
    population done for batch: 15
    population done for batch: 16
    population done for batch: 17
    population done for batch: 18
    population done for batch: 19
    0.344: [GC 0.344: [ParNew: 17434K->592K(19136K), 0.0011238 secs] 17434K->592K(83008K), 0.0011645 secs] [Times: user=0.00 sys=0.01, real=0.00 secs] 
    population done for batch: 20
    population done for batch: 21
    population done for batch: 22
    population done for batch: 23
    population done for batch: 24
    population done for batch: 25
    population done for batch: 26
    population done for batch: 27
    population done for batch: 28
    population done for batch: 29
    population done for batch: 30
    0.353: [GC 0.353: [ParNew: 17616K->543K(19136K), 0.0011398 secs] 17616K->543K(83008K), 0.0011770 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
    population done for batch: 31
    population done for batch: 32
    population done for batch: 33
    
    0.337: [Full GC (System) 0.337: [CMS: 0K->400K(63872K), 0.0219250 secs] 3296K->400K(83008K), [CMS Perm : 4423K->4422K(21248K)], 0.0220152 secs] [Times: user=0.04 sys=0.00, real=0.02 secs] 
    population done for batch: 0
    0.364: [Full GC (System) 0.364: [CMS: 400K->394K(63872K), 0.0161792 secs] 2492K->394K(83008K), [CMS Perm : 4425K->4425K(21248K)], 0.0162336 secs] [Times: user=0.01 sys=0.00, real=0.02 secs] 
    population done for batch: 1
    0.382: [Full GC (System) 0.382: [CMS: 394K->394K(63872K), 0.0160193 secs] 2096K->394K(83008K), [CMS Perm : 4425K->4425K(21248K)], 0.0160834 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] 
    population done for batch: 2
    0.399: [Full GC (System) 0.399: [CMS: 394K->394K(63872K), 0.0160866 secs] 2096K->394K(83008K), [CMS Perm : 4425K->4425K(21248K)], 0.0161489 secs] [Times: user=0.02 sys=0.00, real=0.02 secs] 
    population done for batch: 3
    0.417: [Full GC (System) 0.417: [CMS: 394K->394K(63872K), 0.0156326 secs] 2096K->394K(83008K), [CMS Perm : 4425K->4425K(21248K)], 0.0156924 secs] [Times: user=0.02 sys=0.00, real=0.02 secs] 
    population done for batch: 4
    0.434: [Full GC (System) 0.434: [CMS: 394K->394K(63872K), 0.0157274 secs] 2096K->394K(83008K), [CMS Perm : 4425K->4425K(21248K)], 0.0157897 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] 
    population done for batch: 5
    
    System.gc();
    Thread.sleep(500);
    System.gc();