Java 常见问题

内存划分

OutOfMemoryError

heap 溢出 OutOfMemoryError

heap 用来存储对象实例

heap 内存的溢出条件:

  • 不断有对象实例被创建,添加到 heap
  • 并且 GC roots 到达对象时,垃圾回收还没有腾出足够的空间 JVM 垃圾回收算法 可达性分析
  • 对象数量在达到最大堆容量后内存溢出

相关的 JVM 参数

  • -Xms 可以和 -Xmx 设定成一样避免堆自动扩展
  • -Xmx
  • -XX:+HeapDumpOnOutOfMemoryError 虚拟机在内存溢出时自动 Dump 当前内存堆转储快照

java.lang.OutOfMemoryError

分析

Eclipse Memory Analyzer

栈溢出 StackOverflowError

调用栈溢出

相关JVM参数:

  • Xss 栈内存

Runtime 常量池溢出

  • -XX:PermSize=10M
  • -XX:MaxPermSize=10

通过 JVM 参数设定大小

RuntimeConstantPoolOOM

方法区溢出

溢出条件:

  • 方法区,Class 信息,类名,访问修饰符,常量池,字段描述,方法描述,运行时产生大量的类导致溢出

本机直接内存溢出

内存无法分配时