查看GC下载插件-VisualVM网址:VisualVM: Plugins Centers(和自己的jdk版本对应)
在工具中进行安装插件
连接远程的JVM
添加启动参数
-Djava.rmi.server.hostname=远程主机ip -Dcom.sun.management.jmxremote.port=jmx连接端口 -Dcom.sun.management.jmxremote.rmi.port=jmx监控端口 -Dcom.sun.management.jmxremote.authenticate=false //认证开启 -Dcom.sun.management.jmxremote.ssl=false //ssl开启
jvisualvm 中先添加远程主机,然后再添加jmx远程连接
拓展:堆内存空间
eden:s0:s1=8:1:1
s0和s1 一个是form一个是to GC之后空的为to
eden区满了 Minor GC到form区(Minor GC是发生在新生代中的垃圾收集动作,所采用的是复制算法)
简单解释:eden经历gc之后,到from。from区满了经历gc之后到to区,对象经历15次gc之后还存活,就到old区,特殊的大对象(需要分配一块较大的连续内存空间)经历gc之后还存活就进入老年代
详细解释:
当对象在 Eden ( 包括一个 Survivor 区域,这里假设是 from 区域 ) 出生后,在经过一次 Minor GC 后,如果对象还存活,并且能够被另外一块 Survivor 区域所容纳( 上面已经假设为 from 区域,这里应为 to 区域,即 to 区域有足够的内存空间来存储 Eden 和 from 区域中存活的对象 ),则使用复制算法将这些仍然还存活的对象复制到另外一块 Survivor 区域 ( 即 to 区域 ) 中,然后清理所使用过的 Eden 以及 Survivor 区域 ( 即 from 区域 ),并且将这些对象的年龄设置为1,以后对象在 Survivor 区每熬过一次 Minor GC,就将对象的年龄 + 1,当对象的年龄达到某个值时 ( 默认是 15 岁,可以通过参数 -XX:MaxTenuringThreshold 来设定 ),这些对象就会成为老年代。
特殊情况:对于一些较大的对象 ( 即需要分配一块较大的连续内存空间 ) 则是直接进入到老年代。虚拟机提供了一个-XX:PretenureSizeThreshold参数,令大于这个设置值的对象直接在老年代分配。这样做的目的是避免在Eden区及两个Survivor区之间发生大量的内存复制,因为新生代采用的是复制算法收集内存
老年代的收集:标记-清除(可达性分析)
堆空间和方法区/元空间满了:就是OOM
堆参数
-
-Xms:初始堆大小,默认为物理内存的1/64。
-
-Xmx:最大堆大小,默认物理内存1/4。
-
-Xmn:新生代大小,默认整个堆的3/8。
-
-XX:MinHeapFreeRatio:设置堆空间最小空闲比例。当对空间的空闲内存小于这个数值时,JVM便会扩展堆空间。
-
-XX:MaxHeapFreeRatio:设置堆空间的最大空闲比例。当堆空间的空闲内存大于这个数值时,便会压缩堆空间,得到一个较小的堆。
-
-XX:NewSize:设置新生代的大小。
-
-XX:NewRatio:设置老年代与新生代的比例,它等于老年代大小除以新生代大小。
-
-XX:SurviorRatio:新生代中eden区与survivior区的比例,设置为8,则两个Survior区与一个Eden区的比值为2:8,一个Survior区占整个新生代的1/10。
-
-XX:TargetSurvivorRatio:设置survivior区的可使用率。当survivior区的空间使用率达到这个数值时,会将对象送入老年代。
-
-XX:+HeapDumpOnOutOfMemoryError:OOM时导出堆到文件。
-
-XX:HeapDumpPath:导出OOM的路径。
-
-XX:OnOutOfMemoryError:在OOM时执行一个脚本。