Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.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 在JVM上启用转义分析的经验_Java_Scala_Jvm_Escape Analysis - Fatal编程技术网

Java 在JVM上启用转义分析的经验

Java 在JVM上启用转义分析的经验,java,scala,jvm,escape-analysis,Java,Scala,Jvm,Escape Analysis,我刚刚尝试了在jdk6-u18VM(在solaris上)上启用的-XX:+doescapesanalysis选项,体验相当令人失望。我正在运行一个scala应用程序,它有相当多的参与者(20000个)。这是一个垃圾创建的配方 通常,该应用程序可以运行256Mb堆,但会产生大量垃圾。在其稳定状态下: 在GC中花费10%的时间 在1中生成>150Mb的垃圾转义分析在JConsole中是否显示为已启用?您需要确保正在使用-server选项运行VM。我想你已经成功了,但我只是想检查一下 2我认为逃避分

我刚刚尝试了在jdk6-u18VM(在solaris上)上启用的
-XX:+doescapesanalysis
选项,体验相当令人失望。我正在运行一个scala应用程序,它有相当多的参与者(20000个)。这是一个垃圾创建的配方

通常,该应用程序可以运行256Mb堆,但会产生大量垃圾。在其稳定状态下:

  • 在GC中花费10%的时间

  • 1中生成>150Mb的垃圾转义分析在JConsole中是否显示为已启用?您需要确保正在使用-server选项运行VM。我想你已经成功了,但我只是想检查一下

    2我认为逃避分析对Scala演员的情况没有帮助。如果您执行以下操作,您可能会看到巨大的收益:

    def act():Unit = {
       val omgHugeObject = new OMGHugeObject();
       omgHugeObject.doSomethingCrazy();
     }
    
    在上面的示例中,EscapeAnalysis将使
    omgHugeObject
    可以在堆栈而不是堆上分配,因此不会创建垃圾。我认为逃逸分析不太可能对演员有所帮助。它们的引用总是“转义”到actor子系统

    3 您是否正在使用Scala的最新版本?有一个内存泄漏,我相信在最近的版本中已经修复。这甚至导致产生了自己的演员库,您可以查看

    4您可以尝试G1垃圾收集器,您可以通过以下方式启用它:


    -XX:+UnlockExperimentalVMOptions-XX:+UseG1GC

    我建议您尝试增加新一代的大小,例如
    -XX:NewSize=96M XX:NewRatio=3
    。使用JVisualVM(包含在JDK中)和插件来观察年轻空间和旧空间的使用情况。

    来自:

    请注意,基于转义分析的优化(-XX:+DoEscapeAnalysis)在6u18中被禁用。此选项将在将来的JavaSE6更新中恢复


    如果对象从一个线程转移到另一个线程,那么不仅堆栈分配不可能,而且线程本地分配缓冲区(TLAB)也会出现问题。我相信JRockit JVM在线程本地内存行为方面更具攻击性。我不希望escape分析能够帮助参与者本身,但在堆栈上的应用程序中还有很多其他隐式转换可以省略。我只是希望在GC头上做点什么!G1的问题在于,使用JConsole不可能真正看到正在发生的事情—堆分析已启用。我不需要
    -server
    ,因为我在solaris monster上运行,所以JVM默认为服务器。是的,我正在使用scala 2.7.7。我接受这个答案,因为我现在认为还有其他事情在发生;我会问一个单独的问题是的-我试过这个,但几乎没有任何区别。我尝试了从1到4的比率是的,它在Java6U23和更高版本中默认启用(请参阅)。