Java内存模型

Java内存模型,第1张

Java内存模型 运行时数据区域

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

程序计数器

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

Java虚拟机栈

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

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

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

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

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

存放对象实例的线程共享内存区域,垃圾收集器的主要管理区域(故又称“GC堆”)。详见垃圾回收机制

方法区

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

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

运行时常量池

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

直接内存

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5685301.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存