记一次JVM调优过程

最近对项目进行压力测试发觉系统运行效果不好,监控JVM后发觉JVM在频繁进行FGC

 

开启jconsole 对远程jvm进行监控

 

 

 

利用jstat查看jvm内存情况

https://www.cnblogs.com/lizhonghua34/p/7307139.html

1. 配置获取Fgc日志

 

2. 获取jvm内存快照文件

 

jmap -dump:format=b,file=jvm.dat 4549

 

3. 获取jvm内存快照文件后分析工具

jhat

 

利用eclipse的MAT工具分析内存快照

https://www.cnblogs.com/wyb628/p/8567610.html

 

参考文档:https://pengjiaheng.iteye.com/blog/538582

https://pengjiaheng.iteye.com/blog/545015

https://www.cnblogs.com/xuezhiyizu1120/p/6237510.html

 

### 关于 JVM 的常见面试问题及解决方案 #### 1. **什么是 JVM ?为什么需要进行 JVM ?** JVM 是指通过整 Java 虚拟机的各种参数,使应用程序能够在特定硬件环境下达到最佳性能的过程。尽管 JVM 的默认配置已经过多次测试并适用于大多数场景[^1],但在某些高并发、大数据量的情况下,默认设置可能无法满足需求。此时就需要针对具体业务场景进行。 #### 2. **常见的 JVM 性能指标有哪些?** 在 JVM 过程中,通常关注以下几个方面的性能指标: - **吞吐量**:单位时间内完成的任务数量。 - **响应时间**:处理单个请求所需的时间。 - **GC 时间占比**:垃圾回收所占用 CPU 时间的比例。 - **堆内存使用率**:程序运行期间堆内存的实际利用率。 这些指标可以通过工具如 `jstat` 或者 VisualVM 进行监控和分析[^2]。 #### 3. **如何选择合适的垃圾收集器?** 不同的应用有不同的性能需求,因此选择适合的垃圾收集器至关重要。以下是几种常用的垃圾收集器及其适用场景: - **Serial 收集器**:简单高效,适用于客户端模式下的小型应用。 - **Parallel 收集器**:注重吞吐量,适用于多核服务器环境。 - **CMS (Concurrent Mark-Sweep)**:低延迟先,适用于交互性强的应用。 - **G1 收集器**:兼顾吞吐量与延迟,在现代大型应用中广泛采用。 #### 4. **JVM 中的元空间是什么?它有什么特点?** 自 JDK 8 开始,永久代被移除,取而代之的是元空间(Metaspace)。元空间的特点如下: - 存储位置从 JVM 内部转移到了本地内存,减少了因永久代不足而导致的 OOM 错误风险。 - 动态扩展能力更强,可以根据实际加载的类文件自动增长。 - 不再受 `-XX:MaxPermSize` 参数限制,而是由操作系统本身的可用内存决定最大容量[^3]。 #### 5. **如何诊断 JVM 的性能瓶颈?** 当遇到性能问题时,可以按照以下流程逐步排查: - 使用命令行工具(如 jstack, jmap, jconsole)获取线程状态和内存分布情况; - 定期录 Full GC 发生频率以及持续时间; - 如果发现异常,则进一步深入分析热点方法或者对象分配行为。 #### 6. **举例说明一次完整的 JVM 过程。** 假设某电商网站高峰期出现了严重的卡顿现象,经初步判断可能是由于频繁触发 Major GC 所致。于是采取以下措施解决问题: - 将年轻代比例增大至整个堆的一半以上 (`-Xmn`) ,减少 Minor GC 次数; - 启用 G1 垃圾收集算法代替原来的 Parallel Scavenge/Mark Sweep 组合(`-XX:+UseG1GC`); - 设置合理的目标暂停时间和初始堆大小(-XX:MaxGCPauseMillis 和 -Xms/Xmx). --- ### 提供一段代码示例展示如何启动带有定制化选项的 JVM 实例 ```java public class CustomJvmOptions { public static void main(String[] args) throws InterruptedException { System.out.println("Starting application with custom JVM options..."); Thread.sleep(10_000); // Simulate long-running process Runtime runtime = Runtime.getRuntime(); System.out.printf("Free Memory: %d MB%n", runtime.freeMemory() / (1024 * 1024)); System.out.printf("Total Memory: %d MB%n", runtime.totalMemory() / (1024 * 1024)); System.out.printf("Max Memory: %d MB%n", runtime.maxMemory() / (1024 * 1024)); } } ``` 上述例子展示了如何打印当前 JVM 的内存统计信息,并可通过外部传递不同参数来改变其表现形式。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值