转载

JVM内存区域 — 《java核心技术》

JVM内存区域划分:

  1. 程序计数器,每个线程都有自己的程序计数器,存储当前线程正在执行的Java方法的JVM指令地址;
  2. Java虚拟机栈,每个线程在创建时都会创建一个虚拟机栈,内部保存一个个栈帧,对应着一次次方法调用。如果在该方法中调用了其他方法,则会创建新的栈帧。栈帧中存储着局部变量表、操作数栈、动态链接、方法正常退出或异常退出的定义等;
  3. 堆,放置Java对象实例,是垃圾收集器重点照顾的区域;
  4. 方法区,所有线程共享的一块内存区域,用于存储元数据,比如类结构信息,以及对应的运行时常量池、字段、方法代码等。由于早期的 Hotspot JVM 实现,很多人习惯于将方法区称为永久代(Permanent Generation)。Oracle JDK 8 中将永久代移除,同时增加了元数据区(Metaspace);
  5. 运行时常量池,方法区的一部分,用于存放各种常量信息,比如编译期生成的各种字面量,以及需要在运行时决定的符号引用;
  6. 本地方法栈,与Java虚拟机栈非常相似,支持对本地方法的调用,也是在每个线程都会创建一个。

JVM内存区域 — 《java核心技术》

有可能发生OOM的地方:

  1. 堆内存不足,抛出“java.lang.OutOfMemoryError:Java heap space”,比如需要分配的数据过大,或者JVM处理引用不及时,堆积起来使得内存无法释放;
  2. Java虚拟机栈和本地方法栈,如果调用过深,会导致StackOverFlowError。如果这时候JVM试图扩展栈空间失败,会抛出OutOfMemoryError;
  3. 老版本的JDK永久代的大小有限,JVM对永久代垃圾回收也不积极,如果不断添加新的类型,则会导致永久代出现OutOfMemoryError。对应的异常信息,会标记出来和永久代相关:“java.lang.OutOfMemoryError: PermGen space”;
  4. 元数据区引入后,方法区内存不再窘迫。如果出现OOM则变成“java.lang.OutOfMemoryError: Metaspace”;
  5. 直接内存不足也会导致OOM。
原文  http://yizhanggou.top/jvmnei-cun-qu-yu-javahe-xin-ji-zhu/
正文到此结束
Loading...