概述
jvm内存分为几个区域:
- 程序计数器
- 虚拟机栈
- 本地方法栈
- 堆
- 方法区
- 运行时常量池
- 直接内存
这些内存区域是在Java进程中细分的,为java程序提供服务
不同的区域存储的内容不一样,生命周期的也不一样
内存区域
程序计数器
这个就跟处理器中的程序计数器的功能差不多,是记录下一条字节码的地址
不过处理器的程序计数器是为进程服务的,jvm中的程序计数器是为线程服务的
所以jvm的程序计数器是线程私有的,声明周期和线程相同,各线程之间的程序计数器互不干扰
因为是记录下一条字节码的地址,所以不对java中native方法服务,native方法会直接开启一个进程,由cpu中的程序计数器来控制
程序计数器是jvm中唯一不会抛出OutOfmemoryError的区域
虚拟机栈
这个也跟cpu中的栈的作用差不多,进入方法时,在栈中入栈一个栈帧,栈帧中记录着局部变量表、操作数栈、动态链接、方法出口。当退出这个方法时,出栈当前栈帧
虚拟机栈因为面向方法服务,所以他是线程私有的
局部变量表
局部变量表中记录着方法中的局部变量的类型(如int,boolean,char,…,引用类型)和这个变量的内存地址
操作数栈
操作数栈相当于cpu中的通用寄存器,存放着被逻辑运算单元处理的值,很多指令都需要从这个区域读取值(add,cmp,mov,…)
方法出口
这里记录着处理完当前方法之后,执行的下一条指令的地址
本地方法栈
本地方法栈其实跟虚拟机栈差不多,只不过是面向native方法服务,虚拟机栈只对字节码服务
堆
这个区域是绝大多数对象生活的地方。自然也是垃圾收集器的重点照顾对象。
该区域负责存储对象的实例,在这里进行对象的内存空间的分配。因为绝大多数对象都生活在这里,所以他是所有线程共享的区域。
堆还细分为新生代区域和老生代区域。新生代区域主要存活的是“朝生夕死”的对象,频繁的出生,又频繁的被消灭,这是被垃圾收集器集火的区域。老生代区域存活的需要稳定存活的对象,所以垃圾收集器比较少光顾这里。
绝大多数对象是存活时间较短的,既生活在新生代。所以新生代区域通常比老生代区域要大。
方法区
方法区记录着已加载类的信息。如全限定名(包名+类名)、方法、字段、描述符、参数、常量、静态变量。此区域也是被所有线程共享。
这个区域还有一个名称——永生代,意味着这个区域很少被清理。因为类的可清理幅度很小,以及判断一个类是否是不再被需要的类要求比较苛刻,所以垃圾收集器很少清理这个区域。
运行时常量池
这个区域记录着编译期生成的字面量和符号引用。同样也是被所有线程共享的。
字面量
字面量包括是被双引号”“标明的字符串,以及在代码中写死的一些基本数据类型,这些都属于常量。
在jdk1.6,运行时常量池是属于方法区的一部分。发现一个常量,首先检查运行时常量池中是否已经存放了这个常量,如果没有存放,则复制一份到运行时常量池中。以后每一次试图创建相同值的常量,都直接引用运行时常量池。
从jdk1.7开始,运行时常量池已经划分到了堆中。对于首次出现的常量,不再复制到运行时常量池,而是在运行时常量池中保留一份引用,指向首次出现常量的内存地址。
直接内存
这个区域其实上不是jvm的一部分,而且属于其他进程的。当调用一个native方法的时候,就可能会产生一份直接内存。
直接内存指的是在native方法中使用的那一块内存空间。比如NIO操作,它是使用native方法来读写文件的,这时就会产生一份直接内存指向读写文件的内存(缓存)。
注意直接内存并不在jvm中,但是会在jvm堆中保持一个引用,指向内存空间的直接内存。这样就避免了类似NIO操作频繁的从内存空间和java堆中来回复制数据。
查看原
文:http://blog.zswlib.com/2016/11/05/jvm%e5%86%85%e5%ad%98%e5%8c%ba%e5%9f%9f/
相关推荐
【初探JVM内存区域】 Java虚拟机(JVM)是Java编程语言的核心组成部分,它为Java应用程序提供了运行环境。理解JVM内存区域对于优化Java应用性能至关重要。本篇文章将详细探讨JVM中的主要内存区域及其作用。 1. **...
JVM 内存区域组成包括栈内存和堆内存。栈内存用于存放基本类型变量和对象的引用变量,而堆内存用于存放由 new 创建的对象和数组。堆的优势是可以动态分配内存大小,生存期也不必事先告诉编译器,但缺点是要在运行时...
"JVM内存区域划分" JVM内存区域划分是Java虚拟机(JVM)中的一种内存管理机制,主要分为五个部分:程序计数器、Java栈、本地方法栈、堆和方法区。这些区域各自扮演着不同的角色,共同组成了JVM的内存管理系统。 ...
JVM性能调优_JVM内存区域划分 JVM(Java Virtual Machine)是 Java 语言的核心组件之一,其性能优化对 Java 应用程序的执行效率和稳定性具有至关重要的影响。在 JVM 中,内存区域的划分和管理是性能优化的关键所在...
在Java面试中,对于JVM内存区域的划分是一个经常会涉及到的考点,因此理解这些知识点对于准备Java相关面试的求职者来说是十分必要的。通过这个文档的学习,我们可以加深对JVM内存管理的理解,进一步掌握Java程序运行...
JVM内存区域详解 JVM 内存区域是 Java 虚拟机在执行 Java 程序的过程中所管理的内存划分。这些区域都有自己的用途,以及创建和销毁的时间。有的区域随着虚拟机的启动而存在,有些区域则依赖用户线程的启动和结束而...
了解JVM内存区域的划分及其工作原理对于Java开发者来说至关重要,这有助于理解和解决性能问题,如内存泄漏和栈溢出。在实际开发中,合理设置JVM参数(如-Xms, -Xmx等)可以有效防止内存错误,同时,通过阅读如《深入...
深入理解JVM内存区域与内存溢出异常
### JVM内存区域详解 #### 一、进程与线程概念 - **进程**:进程是程序执行的基本单位,它代表了一次程序的执行过程。在操作系统中,进程有自己的独立地址空间,不同进程间的地址空间相互隔离。进程从创建、运行到...
《深入理解JVM内存区域》 Java虚拟机(JVM)是Java语言的运行环境,支持多种语言,包括Scala、Kotlin、Groovy等。虚拟机历史了解即可,无需关注Hotspot。 JVM内存区域主要分为五部分:程序计数器、虚拟机栈、本地...
### JVM内存空间分配详解 #### 一、JVM内存模型概览 JVM(Java虚拟机)内存模型主要由以下几个部分组成:程序计数器、Java虚拟机栈、本地方法栈、Java堆以及方法区(在JDK 8之后称为元空间)。下面将对这几个部分...
JVM内存区域划分详细解析: JVM(Java Virtual Machine,Java虚拟机)是运行Java字节码的虚拟机进程。在JVM中,内存区域被划分为几个不同的部分,每一个部分有着不同的用途,从而实现了JVM的稳定和高效运行。根据...
JVM内存区域主要分为线程私有区域【程序计数器、虚拟机栈、本地方法区】、线程共享区域【JAVA堆、方法区】、直接内存。线程私有数据区域生命周期与线程相同,依赖用户线程的启动/结束而创建/销毁(在HotspotVM内,每个...
JVM内存分为几个关键区域,每个区域都有特定的功能和作用。这些区域包括: - **程序计数器(PC Register)**:每个线程都有自己独立的程序计数器,用于记录当前线程执行的字节码的行号。在方法调用、异常处理等过程...
内存管理涉及JVM内存区域,包括堆、栈、方法区、程序计数器和本地方法栈,每部分都有其特定的用途和管理方式。 2. JVM内存模型:JVM内存模型定义了内存中各个部分的关系,以及在多线程环境下如何共享和分配内存。...
1. **堆内存(Heap)**:这是程序共享的内存区域,用于存储对象实例和数组。 2. **方法区(Method Area)**:用于存储类的信息、静态变量、常量池等数据。 3. **栈内存(Stack)**:每个线程都有一个私有的栈,用于存储...
### JVM内存监控工具详解 #### 引言 Java Virtual Machine (JVM) 是运行 Java 应用程序的核心组件,其性能直接影响应用的响应速度和稳定性。JVM 的内存管理是性能优化的关键,尤其是在高并发环境下,合理的内存...
方法区是 JVM 中的一块内存区域,用来存储类的元数据、字段、方法、常量池等信息。方法区是所有线程共享的,方法区中的数据可以被所有线程访问和共享。 运行时常量池 运行时常量池是方法区的一部分,用于存储常量...
- **堆内存**:这是JVM最大的内存区域,用于存储对象实例。堆内存分为新生代(Young Generation)、老年代(Tenured Generation)和持久代(Permanent Generation,Java 8后被元空间Metaspace替代)。 - **新生代*...