JVM-jvisualvm 监控运行的服务

查看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时执行一个脚本。

### 配置 JVisualVM 连接并监控远程服务器性能 #### 启动远程 JVM 的 JMX 服务 为了使本地的 JVisualVM 能够连接到远程 Linux 服务器上的 Java 应用程序,需确保该应用程序已通过特定参数启动以开启 JMX 监控功能。具体来说,在启动命令中加入如下 JVM 参数来配置 JMX: ```bash -Dcom.sun.management.jmxremote.port=<port> -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=<server_ip_address> ``` 其中 `<port>` 是指定用于监听来自客户端请求的 RMI 注册表端口号;`<server_ip_address>` 则应替换为实际服务器 IP 地址[^5]。 #### 安装必要的插件 在本地计算机上打开 `jvisualvm.exe` 文件(位于 JDK 安装路径下的 bin 文件夹内),首次运行时建议安装一些额外的功能模块以便更好地进行性能诊断工作。点击菜单栏中的 "Tools" -> "Plugins" 来访问可用更新列表,并勾选所需项完成下载与激活过程[^4]。 #### 设置防火墙规则允许外部访问 考虑到安全性因素,默认情况下大多数生产环境都会设置较为严格的网络防护策略。因此还需要确认目标机器所在子网内的安全组/iptables 是否开放了上述自定义端口供外界调用。可以执行以下指令临时解除限制(仅适用于测试阶段): ```bash sudo iptables -A INPUT -p tcp --dport <port> -j ACCEPT ``` 同样地,请记得将占位符部分替换成之前设定好的数值[^1]。 #### 创建反向 SSH 隧道(可选) 如果由于 NAT 映射等原因无法直接暴露真实地址给公网,则可通过构建一条稳定的隧道实现间接通信目的。假设本机拥有公钥认证权限的话,那么只需输入下面这条语句即可达成效果: ```bash ssh -L <local_port>:localhost:<remote_jmx_port> user@your_remote_host & ``` 这里需要注意的是,`<local_port>` 和 `<remote_jmx_port>` 均代表同一逻辑概念的不同表现形式而已——即用来转发数据包的目标位置[^3]。 #### 添加新连接至 JVisualVM 最后一步就是在图形界面里新增一个条目指向远端实例啦!切换回 Windows 平台后找到左侧边栏里的 “Remote” 分类标签页,右键单击空白处选取 “Add Remote Host...”,接着按照提示填写相关信息直至成功加载出对应 PID 号码为止[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值