项目启动参数增加以下选项即可:
-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