JVM调优实践

如果出现 OOM(out of memery) 咋办?

  • Java Heap 溢出
  • 可能是内存泄漏,检查 GC roots 引用链或检查虚拟机参数
  • 直接内存内存溢出

Java 中普通 I/O 用输入/输出流方式实现,输入流 InputStream(终端 —> 直接内存 -> JVM),输出流(JVM -> 直接内存 -> 终端),这一过程中有 kenel 与 JVM 之间的拷贝(很多次),为了使用直接内存,Java 是有一块区域叫 DirectBuffer,不是 JavaHeap 而是 CHeap 的一部分。

NIO 支持直接内存的使用,也就是通过 Java 代码,获得一块堆外的内存空间,这块空间是直接向操作系统申请的。它的申请速度比堆内存慢,但访问速度快。

对于那些可复用的,并会被经常访问的空间,使用直接内存可提高系统性能。但由于直接内存没有被 Java 虚机完全托管,若使用不当,也容易触发溢出,导致宕机。

保证它不溢出的方法是合理进行 Full GC(Full GC 时会对这里做 GC)。

JVM 调优有哪些参数?

  • -Xms 初始堆大小
  • -Xmx 最大堆大小
  • -Xmn 年轻代大小
0%