Java内存区域总结
一、Java内存模型
Java运行时数据区一般分为:程序计数器区、方法区、Java栈、Java本地栈、Java堆组成。
1、程序计数器
程序计数器是线程私有的一块较小的内存区域,用于保存当前线程执行字节码的行号指示器,线程的切换、异常都能正确的恢复到指定的要执行的字节码位置都是这个行号指示器的功能,这个区域是一个唯一一个没有抛出OutOfMemoryError的异常。
2、Java栈
Java栈也是线程私有的一块内存区域,它的生命周期与线程的生命周期相同。一个方法被执行的同时会创建一个栈帧,将其压入栈中,方法执行完成的同时就会把此栈帧弹出栈,也就是一个方法从被执行到退出也就是一个栈帧入栈出栈的过程。以前我们经常说的”Java堆”和“Java栈”,很粗的一个说法 —堆也可能说的另外的一个内存区域-堆,栈应该说的不是Java栈,应该是Java栈中的局部变量表-用于保存基本数据类型信息(如:int float long )和对象引用指针、返回类型指针。虚拟机设置参数: -Xxs200k (注意栈的内存大小最少为160k),也可能出现OutOfMemoryError的异常,当请求栈的深度大于JVM所允许的栈的最大深度的时候会抛出一个SatckOverflowError的异常。
3、方法区
方法区是所有线程共享的一片内存区域,用于保存类信息、方法名、静态变量、常量等信息。我们也成为永久代。常量池是方法区的一部分,用于保存字面量和符号。在JVM中设置参数为:-XX:PermSize100M -XX:MaxPermSize300M。也可能出现OutOfMemoryError的异常
4、堆
堆这块内存区域是最为重要的一片内存区域,几乎所有的对象实例都保存在此区域,也是GC管理最重要的区域,也成为GC堆。堆也可以细划分为:老年代和新生代。JVM设置参数:
-Xms10M -Xmx100M 当申请的内存无法申请到足够的内存的时候会出现OutOfMemoryError的异常信息。
5、对象访问
对象访问也就是reference类型如 Object object = new Object();
Object object 这个反应到虚拟机栈中的局部变量表中保存reference类型出现,new Object();这会出现在Java堆中将对象实例放在此内存区域,Object 类型的体现出这些信息保存在方法区中。
reference类型数据访问对象有两种:
5.1、基于句柄池
基于句柄池的对象访问方式是在Java堆中创建一个句柄池,句柄池中保存堆中实例对象的内存地址,而reference 类型的数据保存了堆中句柄池中的一个地址。
5.2、直接内存地址
直接内存地址是reference类型的数据保存的就是Java堆中的所在的实例的地址。
6、直接内存
直接内存不是JVM中的运行时数据区的一部分,这部分也会被频繁的使用。在JDK1.4中引入了NIO 基于通道和缓冲区的新的I/O,可以使用本地函数直接在分配堆以外的内存,在堆中保存一个DrectByteBuffer的直接内存的地址,这样操作可以避免了本地堆和Java堆来回复制数据的问题。这要注意我们在配置Java堆参数的时候一定要考虑到直接内存所占内存的一部分。
相关推荐
### JAVA内存分区与C/C++内存分区的深度解析 #### JAVA内存分区 在JAVA中,JVM(Java虚拟机)的内存主要分为三个区域:堆(heap)、栈(stack)和方法区(method)。每个区域都有其特定的功能和管理机制。 1. **...
【Java内存管理总结】 Java内存管理的核心是对象的分配与释放,主要分为两大部分:对象的分配和垃圾回收。在Java中,所有对象都在堆内存(Heap)中分配空间,而对象的释放则由垃圾回收机制(Garbage Collector,...
### Java内存泄露总结 #### 一、Java内存回收机制 Java中的内存管理主要依赖于垃圾回收(Garbage Collection, GC)机制。与C/C++等需要手动管理内存的语言不同,Java虚拟机(JVM)自动处理对象的创建与销毁过程。...
**JVM 的内存区域组成**包括栈内存和堆内存: 1. 栈内存:主要用于存储基本类型变量和对象引用。局部变量(在方法中定义的变量)通常存储在这里,当方法执行完毕,对应的栈帧会被移除,栈内存空间随之被自动回收。 ...
JAVA内存溢出问题总结 JAVA 内存溢出问题是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用的内存大于虚拟机能提供的最大内存。内存溢出问题可以从容器和程序类两个方面进行排查,容器问题...
JVM的内存区域组成 Java把内存分两种:一种是栈内存,另一种是堆内存。在函数中定义的基本类型变量和对象的引用变量都在函数的栈内存中分配;堆内存用来存放由new创建的对象和数组以及对象的实例变量。在函数(代码...
### 如何解决Java内存泄漏 #### 1. 背景 Java凭借其垃圾回收机制大大简化了内存管理,使得开发者无需手动管理内存的释放,从而提升了开发效率。然而,这种自动化管理也可能成为一把双刃剑,特别是当开发人员忽视...
#### 二、Java内存模型与内存区域 Java虚拟机(JVM)管理着多种不同类型的内存区域,包括堆内存(Heap Memory)、方法区(Method Area)、永久代(Permanent Generation Space)等。不同的内存区域有着不同的作用和特点: ...
总结来说,“Java内存监视器.rar”提供了实践性的工具和思路,帮助开发者深入理解Java内存管理,从而提升程序性能。学习并掌握这些知识,不仅可以优化代码,还能在解决复杂问题时得心应手。对于标签中的“Java源码-...
Java虚拟机(JVM)的内存区域可以分为栈内存和堆内存。栈内存主要存储函数中定义的基本类型变量和对象的引用,其特点是存取速度快,但空间有限,且生命周期与函数调用同步。当函数执行完毕,栈内存中的数据会被自动...
Java内存分配主要涉及以下几个区域: 1. **寄存器**:由硬件直接支持,用于存储处理器级别的局部变量。程序员通常无法直接控制。 2. **栈**:用于存储基本类型的数据和对象的引用。当变量离开作用域时,栈内存会被...
#### 二、Java内存区域概述 Java程序在运行时会根据不同的数据类型和生命周期将其分配到不同的内存区域。这些内存区域主要包括: 1. **寄存器**:用于临时存放CPU计算过程中产生的中间结果,这部分内存不由程序员...
Java内存模型(JMM)是Java编程中的一个重要概念,它规定了程序中各个变量的访问规则,尤其是在多线程环境下如何保证数据的一致性和可见性。JMM的目标是为了解决由于编译器优化、处理器缓存和多处理器系统间的内存...
#### 一、Java内存区域划分 Java的内存管理机制将内存分为以下几个区域: 1. **栈(Stack)**: - 存储局部变量(如基本类型的变量和对象的引用)。 - 每个线程拥有一个独立的栈。 - 栈内存中的数据在方法执行...
1. **Java内存区域** Java内存分为五个主要区域:程序计数器、虚拟机栈、本地方法栈、堆和方法区(在Java 8及之后版本被元空间取代)。这些区域各自有不同的功能和生命周期: - **程序计数器**:存储当前线程正在...