2.2 运行时数据区域
根据Java虚拟机规范,Java虚拟机所管理的内存包含以下几个运行时数据区域:
程序计数器,虚拟机栈,本地方法栈,Java堆,方法区。
线程共享:Java堆,方法区
线程私有:程序计数器,虚拟机栈,本地方法栈
1)程序计数器
1-程序计数器是一块较小的内存,可以看作是当前线程所执行的字节码的行号指示器
2-字节码解释器在工作时,就是通过改变这个计数器的值来选取下一条需要执行的字节码指令
3-每条线程都需要有一个独立的程序计数器,互不影响,独立存储,这类区域的内存称为“线程私有”的内存
4-此内存区域是唯一在Java虚拟机规范中没有规定任何OOM情况的区域
2)Java虚拟机栈
1-与程序计数器一样,是线程私有的,它的生命周期和线程相同
2-虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口信息等
3-每一个方法从调用到执行结束的过程,都会对应着一个栈帧在虚拟机栈中的入栈和出栈的过程
4-Java虚拟机规范中,对这个区域规定了两种异常状态:
-StackOverflowError异常:
如果线程请求的栈深度超过虚拟机所允许的深度,则会抛出这个异常
-OutOfMemoryError异常:
如果虚拟机栈可以动态扩展,如果扩展时无法申请到足够的内存,则会抛出这个异常
3)本地方法栈
1-本地方法栈的作用和虚拟机栈是相似的,它们之间的区别是,虚拟机栈是为Java方法服务,而本地方法栈为虚拟机使用到Native方法服务
2-sun HotSpot虚拟机把虚拟机栈和本地方法栈二合为一
3-本地方法栈也会抛出:
StackOverflowError
OutOfMemoryError
4)Java堆
1-Java堆是Java虚拟机所管理的内存中最大的一块,是线程共享的一块区域
2-此区域的唯一目的就是存放对象实例
3-Java堆还可以细分为:新生代和老年代;再细一点还可以分为:Eden空间,From Survior空间,To Survivor空间
4-根据Java虚拟机规范,Java堆可以处于物理上不连续的内存空间中,主要逻辑上是连续的即可;在实现上,可以实现成固定大小,也可以实现成可扩展
5-如果堆中没有内存完成实例分配,并且无法再扩展,则会抛出:
OutOfMemoryError
5)方法区
1-方法区与Java堆一样,是线程共享的内存区域
2-它用来存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等
3-在HotSpot虚拟机上的开发者,常常称这块为“永久代”
4-根据Java虚拟机规范,方法区可以是不连续的物理内存,可以固定大小或者可扩展,还可以选择不实现垃圾收集
5-当方法区无法满足内存分配时,则会抛出:
OutOfMemoryError
6)运行时常量池(方法区的一部分)
1-方法区的一部分
2-Class文件除了有类的版本,字段,方法,接口等描述信息外,还有一个项信息就是常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载之后存放在方法区的运行时常量池中
3-对于方法区的运行时常量池,虚拟机没有做任何细节上的要求,一般来说,除了保存Class文件中描述的符号引用外,还会保存翻译出来的直接引用
2-当常量池无法在申请到内存时,则会抛出:
OutOfMemoryError
7)直接内存
1-不是虚拟机运行时数据的一部分,也不是Java虚拟机规范中定义的内存区域。
2-但是这部分内存比较频繁被使用,而且会导致OOM异常
3-直接内存分配不受Java堆大小的限制,但是既然是内存,肯定还是会受到本机总内存大小与物理寻址空间的限制
相关推荐
Java内存区域是Java虚拟机(JVM)管理内存的核心组成部分,它们主要分为以下几个部分: 1. **程序计数器(Program...开发者应当关注内存分配、垃圾收集策略以及对象访问方式,以提高程序效率并避免内存溢出异常。
JAVA 内存溢出问题是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用的内存大于虚拟机能提供的最大内存。内存溢出问题可以从容器和程序类两个方面进行排查,容器问题可以调整容器参数来解决...
Java内存机制是Java虚拟机(JVM)的关键组成部分,它管理着程序运行时的数据存储。在Java中,内存主要分为以下几个区域: 1. **Heap(堆)**:这是Java中最主要的内存区域,用于存储所有的类实例和数组。当堆空间...
Java内存溢出问题,全称为Java OutOfMemoryError,是Java开发者经常遇到的运行时异常。内存溢出通常发生在程序运行过程中,系统无法为运行的应用程序分配足够的内存资源,导致程序无法正常执行。理解并解决Java内存...
Java内存溢出问题通常指的是程序在试图分配内存时,无法找到足够的连续内存空间而抛出的异常。在Java中,内存分为几个区域:堆(Heap)、栈(Stack)、方法区(Method Area,Java 8后被元空间取代)以及程序计数器和...
Java堆是Java虚拟机中最大的一块内存区域,用于存储对象实例。当程序创建新的对象并分配给堆时,如果堆空间不足,就会抛出`OutOfMemoryError: Java heap space`异常。Java应用程序可以通过设置JVM的启动参数来控制堆...
Java内存溢出问题通常指的是Java应用程序在运行过程中由于内存分配不当或使用过度导致JVM无法分配更多的内存,从而抛出`java.lang.OutOfMemoryError`异常。本文将深入探讨Java内存溢出的不同类型及其解决方案。 1. ...
在 JVM 中,如果 98%的时间是用于 GC 且可用的 Heap size 不足 2%的时候将抛出内存溢出异常信息。Heap Size 最大不要超过可用物理内存的 80%,一般的要将 Xmx 和 Xms 设置相同避免每次 GC 后都要调整虚拟机堆的...
10. **日志和异常处理**:当发生内存溢出时,JVM会生成堆转储文件(hprof),通过分析这些文件可以找出问题原因。同时,良好的异常处理和日志记录可以帮助追踪问题。 11. **监控与调优**:使用JMX(Java Management...
- 特别是在大数据量处理场景下,如大量查询返回结果时,如果一次性加载过多数据到内存,可能会导致内存溢出。 #### 具体案例分析 1. **Hibernate查询优化**: - 在使用Hibernate进行数据库查询时,如果一次性...
Java内存溢出异常是开发过程中常见的问题,它通常会导致程序崩溃。本文主要分析了Java程序内存溢出的原因,并提供了一些解决方法。 首先,Java虚拟机(JVM)内存分为几个区域,包括堆、栈、程序计数器、方法区等。...
每一个Java应用程序启动时都会创建一个独立的Java虚拟机(JVM)实例,每个JVM实例都会有自己的Java堆内存区域。 - **内存分配与回收**:当我们在代码中创建一个新的对象时,JVM会在堆内存中为其分配一块内存。当...
#### 二、Java内存模型与内存区域 Java虚拟机(JVM)管理着多种不同类型的内存区域,包括堆内存(Heap Memory)、方法区(Method Area)、永久代(Permanent Generation Space)等。不同的内存区域有着不同的作用和特点: ...
内存溢出主要是由于JVM在运行时分配给各个内存区域的大小不足所引起。对于`PermGen space`错误,主要原因是永久代(PermGen space)内存不足。永久代主要用于存储类的信息、常量、静态变量等数据。当应用加载的类较...
Java内存管理和内存问题,特别是内存泄露与内存溢出,是Java开发者必须面对的重要主题。本文主要探讨了Java内存溢出的检查方法和工具,以及内存泄露的基本原理。 首先,当Java应用程序抛出`java.lang....
内存溢出(Out of Memory)是指程序在运行过程中申请的内存超过了系统能提供的最大内存限制时,程序会抛出异常,导致应用崩溃或者无法正常运行。这种现象在Java等面向对象的编程语言中较为常见。 #### 知识点二:...
在JBoss运行过程中,常见的内存溢出异常包括: 1. **PermGen Space(永久代)内存溢出**:当JVM的永久代空间不足时,会抛出`java.lang.OutOfMemoryError: PermGen space`异常。 2. **Heap Space(堆空间)内存溢出*...
#### 二、JVM运行时数据区域 - **程序计数器(Program Counter Register)**:当前线程所执行的字节码的行号指示器。每条线程拥有独立的程序计数器,因此它属于线程私有区域。不会发生内存溢出。 - **Java虚拟机栈...