项目启动参数增加以下选项即可:

-Djava.rmi.server.hostname=192.168.0.129 (服务所在 IP)

-Dcom.sun.management.jmxremote

-Dcom.sun.management.jmxremote.port=9192 (JConsole 要连接的端口,不能与项目一样)

-Dcom.sun.management.jmxremote.rmi.port=9193 (rmi 方式连接,不能与项目一样)

-Dcom.sun.management.jmxremote.ssl=false

-Dcom.sun.management.jmxremote.authenticate=false

以某项目(192.168.0.129,jar 文件)为例,启动命令如下:

nohup java -jar -Djava.rmi.server.hostname=192.168.0.129 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9192 -Dcom.sun.management.jmxremote.rmi.port=9193 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false test-1.0.0.jar &

然后启动 % JAVA_HOME%/bin/jconsole.exe, 输入进程 ip 和端口,点击连接即可。

进程实际情况如下,使用情况:

通过观察发现一次次的堆内存使用量有较大幅度的变化,多次进行 GC。

进一步分析堆内存情况。

每次经过 GC 之后老年区一直都在提升,说明对象在进行 GC 后被移动到老年区了。

 

Eden 新生区,对象随着时间的变化生成的速度越来越快,GC 不断进行回收操作,系统频繁调用 GC。

存活期对象,在不断的进行 GC 操作之后,将被不断的从 eden 区 copy 到 survive 区,通过经过不多 gc 回收标记,在 14:57 时被批量移动到 old 区,所以空间在不断下降。

而非堆区数据一致保持较平稳状况,所以内存较为平稳。

 通过分析发现,堆区对象在不断生成,并且不断增加,即使在进行回收的时候也无法回收掉,可以理解为,此处有与不断产生 斐波那契 序列并存储出现的问题,由于后续的数据非常大,所以非必须应该放弃缓存,或在获得结果后进行转存,如数据库等。

 

另外,我们可以查看线程情况,通过下图可以查看 main 方法中的 Thread.sleep (); 方法话费了 2638,可以在程序中去掉。

本文转载自:https://www.cnblogs.com/dava/p/6686436.html