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/

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » JVM内存区域 — 《java核心技术》

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址