参考:https : //bugs.java.com/bugdatabase/view_bug.do?bug_id=8186315
我真的很难找出MinRAMPercentage的功能,尤其是与InitialRAMPercentage相比。
我假设InitialRAMPercentage设置了启动时的堆数量,MinRAMPercentage和MaxRAMPercentage设置了允许JVM收缩/增长到的堆的上下限。
显然不是这样。当我启动JVM(使用UseContainerSupport,具有这些新的内存设置参数)时,如下所示:
java -XX:+UseContainerSupport -XX:InitialRAMPercentage=40.0 -XX:MinRAMPercentage=20.0 -XX:MaxRAMPercentage=80.0 -XX:+PrintFlagsFinal -version | grep Heap
Run Code Online (Sandbox Code Playgroud)
设置InitialHeap和MaxHeap,没有找到“最小堆大小”值;因此,该MinRAMPercentage似乎从未被使用过。
超级困惑,显然我不是唯一的一个。正如我在这里和这里所收集的那样,OpenJ9帅哥似乎也没有完全解析这些选项的意图。他们似乎选择不实施MinRAMPercentage afaics。
因此:设置MinRAMPercentage的实际预期用途和效果是什么?
在处理我们的Neo4J图形应用程序并为根记录器设置调试日志记录时,我遇到了以下统计信息,例如消息:
[DEBUG] HttpURLConnection: sun.net.www.MessageHeader@537f294a7 pairs: {GET /?totalmem=12758278144+propids=0+os.arch=amd64+edition=community+dist=unknown+source=maven+numprocs=4+mac=005056c00008+revision=2.1.5:2.1-maint:529/45c3cc04946c2b0e243e48c8252e40cb85931744+tags=spring,sdn,web+os.version=6.3+reg=unreg+relids=0+v=2.1.5+heapsize=47775896+os.name=Windows_8.1+id=641ca9a78ddc53ae+labelids=3+nodeids=0+p=-1 HTTP/1.1: null}{Cache-Control: no-cache}{Pragma: no-cache}{User-Agent: Java/1.8.0_51}{Host: 52.0.233.188}{Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2}{Connection: keep-alive}
[DEBUG] HttpURLConnection: sun.net.www.MessageHeader@167dbd419 pairs: {null: HTTP/1.1 200 OK}{Server: nginx/1.6.2}{Date: Sun, 30 Aug 2015 10:05:40 GMT}{Content-Type: text/html}{Content-Length: 164}{Last-Modified: Fri, 01 Jun 2012 09:48:29 GMT}{Connection: keep-alive}{ETag: "4fc88fed-a4"}{Accept-Ranges: bytes}
Run Code Online (Sandbox Code Playgroud)
我有点惊讶,因为我没有在Neo4j中配置任何东西,告诉它与互联网上的某个Web服务器共享我的机器配置.
顺便说一下,我知道它是neo4j,因为版本号(2.1.5)和社区版关键字,以及ip号52.0.233.188,它解析为亚马逊aws dns条目,但将自己标识为udc.neo4j.org.
我是JProfiler的新手.我创建了一个非常简单的测试应用程序.这是一个带有main方法的Main.java:
package com.example;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
Example e = new Example(); //Gets gc'ed?
System.out.println(e.getMessage());
System.in.read();
System.exit(0);
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,我暂停直到按键.这样我确定主要范围不会结束,直到我按下一个键,所以我希望e存在而不是垃圾收集(如果这个假设不正确,请纠正我).Example类:
package com.example;
public class Example {
public String getMessage() {
String testString = "This is the test string. Press a key to exit.";
return testString;
}
}
Run Code Online (Sandbox Code Playgroud)
我使用JProfiler Eclipse插件启动上述应用程序.我创建了一个基于Full Instrumentation配置文件的会话; 我删除了Java EE和JDBC特定的探测器,剩下的就是默认值.
现在,当探查器启动时,我转到所有对象视图,我希望找到com.example.*类,但我找不到; 为什么会这样?
好吧,也许我只能在使用其他视图时找到这些对象,比如Allocation调用树,所以我使用视图中的按钮启用Allocation Recording(默认情况下禁用).它要求我点击之后计算分配,弹出一个对话框.我接受了默认值,并且我看到了一个空的视图,可以自动更新永恒的空虚.
那么我试试Heap Walker.它要求我先进行转储.我得到一个对话框,为我提供"选择记录的对象"的选项,默认情况下未选中.我将它保留为默认值,并显示实例计数视图.但是,在我提供的这个Classes视图中找不到我的对象.
所以我想我做的事情根本就是错误的; 我该怎么做才能看到我的对象,特别是我的对象的精确实例数?
更新1: 我发现了问题的一部分.当探查器窗口出现时,它会显示"会话启动"对话框,您可以在其中选择配置文件并设置各种设置.在名为"Startup"的第一个选项卡上有一个小部分,其中有一个名为"Initial recording profile"的设置,默认设置为[no recordings].当我将其保留为默认值时,我找不到Example对象.当我将其设置为"CPU录制"时,我可以在"所有对象"视图中找到我的示例对象.
更新2: 我在Heap Walker中找不到对象.当我在All Objects视图中选择com.example.Example时,我可以右键单击该对象并选择(在Heap Walker中显示对象).当我这样做时,Heap …