JVM 实战优化与问题排查
内存模型与垃圾回收调优
Java 堆内存通常分为新生代(Young Generation)和老年代(Old Generation)。新生代采用复制算法,而老年代采用标记-清除或标记-整理算法。通过调整比例可优化性能:
// 常见JVM参数示例
-XX:NewRatio=2 // 新生代与老年代比例1:2
-XX:SurvivorRatio=8 // Eden与Survivor区比例8:1:1
-XX:+UseG1GC // 启用G1垃圾收集器
G1收集器适合大内存场景,其分区模型能有效降低停顿时间。监控GC日志可发现潜在问题:
-XX:+PrintGCDetails -Xloggc:/path/to/gc.log
堆外内存泄漏排查
DirectByteBuffer或NIO框架可能引发堆外内存泄漏。使用Native Memory Tracking(NMT)工具诊断:
-XX:NativeMemoryTracking=detail
jcmd <pid> VM.native_memory summary
典型症状为物理内存持续增长但堆内存正常。案例代码演示泄漏场景:
// 模拟堆外内存泄漏
public class OffHeapLeak {
static List<ByteBuffer> list = new ArrayList<>();
public static void main(String[] args) throws Exception {
while(true) {
list.add(ByteBuffer.allocateDirect(1024*1024));
Thread.sleep(100);
}
}
}
线程问题诊断
死锁检测可通过jstack工具实现:
jstack -l <pid> > thread_dump.txt
线程池配置不当会导致阻塞,以下代码展示错误用法:
// 错误线程池配置示例
ExecutorService executor = Executors.newFixedThreadPool(100);
for(int i=0; i<1000; i++) {
executor.submit(() -> {
try {
1032

被折叠的 条评论
为什么被折叠?



