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

-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,可以在程序中去掉。