栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Java内存模型

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java内存模型

运行时数据区域

Java虚拟机在运行程序时将其管理的内存分为若干数据区域:

程序计数器

记录当前线程执行的字节码指令的地址。

Java虚拟机栈

调用方法时会创建一个栈帧存储局部变量表等信息。

可以通过-Xss这个虚拟机参数来指定每个线程的 Java 虚拟机栈内存大小:
该区域可能抛出以下异常:

  • 当线程请求的栈深度超过最大值,会抛出 StackOverflowError 异常;
  • 栈进行动态扩展时如果无法申请到足够内存,会抛出 OutOfMemoryError 异常。
本地方法栈

和虚拟机栈类似,但只为本地方法服务。

Native Method,由其他语言编写,编译成基于处理器的机器码,本质是Java调用非Java代码的接口。

存放对象实例的线程共享内存区域,垃圾收集器的主要管理区域(故又称“GC堆”)。
由于目前GC采用分代算法,因此Java堆可以分为新生代和老年代。

分代回收的设计是,对象首先被分配在新生代,经历过垃圾回收后若仍存活,则移到老年代。但这样老年代很快会被填满,导致触发Major GC,性能受影响。
于是将新生代分为Eden区和Survivor区,Eden满时触发Minor GC,将存活的对线移至Survivor区。这样直到对象经历过一定阈值次的回收仍存活时,再将其移到老年代,这样就减少了Major GC(可视为Full GC)。
那为什么要设置俩Survivor区?答案是为了解决内存碎片问题。
单一Survivor区:

双Survivor区(保证有一个Survivor区为空,实现连续存储):

方法区

存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
JDK1.8之后,方法区被元空间取代,使用本地内存,不再位于虚拟机内存中。
因为方法区的大小受虚拟机内存限制,容易溢出;而元空间使用直接内存,只受系统内存限制,不容易溢出。

方法区是Java虚拟机规范中的定义,相当于接口;永久代是HotSpot虚拟机对方法区的具体实现,相当于类。

运行时常量池

运行时常量池是方法区的一部分,Class 文件中的常量池(编译器生成的各种字面量和符号引用)会在类加载后被放入这个区域。
JDK1.7把字符串常量池从方法区移到了堆中。

直接内存

JDK1.4 中新加入的 NIO(New Input/Output) 类,引入了一种基于通道(Channel)与缓存区(Buffer)的 I/O 方式,它可以直接使用 Native 函数库直接分配堆外内存(Native 堆),然后通过一个存储在 Java 堆中的 DirectByteBuffer 对象作为这块内存的引用进行操作。这样就能在一些场景中显著提高性能,因为避免了在 Java 堆和 Native 堆之间来回复制数据。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/680515.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号