【深入理解Java虚拟机】自动内存管理机制——内存区域划分
Java与C++之间有一堵有内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来。C/C++程序员既拥有每一个对象的所有权,同时也担负着每一个对象生命从开始到终结的维护责任,而Java最大的优势之一就是将内存控制的权力交给了Java虚拟机。在虚拟机自动内存管理机制的帮助下,程序员几乎不用担心内存泄漏和内存溢出的问题。
然而,这里说的仅仅是几乎不会出现,特殊情况下,一旦出现了类似问题,程序员也需要对虚拟机的自动内存管理机制有所了解,才可能排查出相应的错误。
Java虚拟机内存区域划分
Java虚拟机在执行java程序的过程中,会把它所管理的内存划分为几个不同的数据区域,每个数据区域有各自的用途,有些随虚拟机进程启动而存在,有些随用户线程而存在。这些区域主要包括:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区、直接内存。

1. 程序计数器
程序计数器是很小的一个空间,可以看做是当前线程所执行的字节码的行号指示器,也就是用以决定下一条将要执行的字节码指令,比如分支、循环、跳转等语句都需要依赖PC来完成。
由于多线程之间是通过时间片轮转来占用CPU资源,所以每一个线程都有自己独立的程序计数器,各线程独立存储,互不影响,因此,这一小块内存是线程私有的。
需要注意一点:如果线程执行的是java方法,那么PC记录的是正在执行的字节码指令地址;而如果正在执行的是Native方法(本地方法,实现不是由java语言完成的),那么PC值为空。
2. Java虚拟机栈
虚拟机栈就是我们常说的内存中的栈空间,也是线程私有的,生命周期与线程相同,是为字节码(Java方法)服务的,用来支持java方法的执行。
虚拟机栈里存放的元素是栈帧(用以存放局部变量表、操作栈、动态链接、方法返回值、附加信息等),每一个方法从调用直到执行完成,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。java方法是基于栈的执行引擎,这里的栈指的就是栈帧中的操作栈。
栈帧的结构重点是局部变量表和操作栈,其余都属于栈帧信息。需要注意的是,栈帧中需要多大的局部变量表,多大的操作栈,这些都是在编译时就确定的,存在了方法表的Code属性中,运行时不会改变。
局部变量表用以存放方法的参数和内部定义的局部变量,基本单位是slot(变量槽,一般是32位),64位的long和double会占据两个连续的slot。局部变量表的开头存放的是参数,对于实例方法,第0位索引的slot默认是this参数,后续依次是其他参数。参数表之后是内存定义的其他局部变量。
操作栈是java方法执行所依赖的基本结构,各种字节码指令都是通过向操作栈中写入和提取内容来完成相应的运算或者调用其他的方法。所有的运算过程,都以操作栈的出栈和入栈作为信息交换的途径。
3. 本地方法栈
本地方法栈和虚拟机栈是完全相同的,唯一的差别是本地方法栈是为native方法服务,有的虚拟机将这两部分合二为一,有的分成两部分实现,本质上没有差别。
4. Java堆
堆空间是虚拟机所管理内存中最大的一块,所有的对象实例以及数组都在堆上分配(简单理解就是一般所有new出来的都在堆空间中),由虚拟机启动时创建,所有线程共享这一块区域。
Java堆不一定物理上连续,逻辑上连续即可。更重要的一点是,Java堆是垃圾收集器管理的主要区域,因此也被称为“GC堆”。现在的垃圾收集器一般都采用分代收集算法,也就是为了更好对内存进行回收,进一步将堆空间划分为:新生代和老年代。新生代更进一步可以划分为:Eden空间、From Survivor空间和To Survivor空间。
5. 方法区
方法区又称为“永久代”,类似于堆空间,是所有线程共享的内存区域,用以存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
方法区同样可以不一定在物理上连续,这一块区域可以实现垃圾收集,也可以不实现,或者直接将堆空间的垃圾收集机制扩展到方法区即可。原因是,这块区域的回收目标主要是常量池的回收和对类型的卸载,这个区域很少情况下需要回收,这也是被称为“永久代”的原因。
方法区中很重要的一部分是运行时常量池,用于存放在编译期生成的各种字面量和符号引用,在类加载完成后进入方法区的运行时常量池中存放。其中,字面量很好理解,比如文本字符串、声明为final的常量值等,而符号引用主要指的是以下三类:类和接口的全限定名,字段的名称和描述符,方法的名称和描述符。
6. 直接内存
直接内存不是虚拟机运行时数据区的一部分,是jdk1.4以后引入的一种基于通道和缓冲区的I/O方式,可以使用native本地函数库直接分配堆外内存。
【深入理解Java虚拟机】自动内存管理机制——内存区域划分的更多相关文章
- 《深入理解 Java 虚拟机》学习 -- 类加载机制
<深入理解 Java 虚拟机>学习 -- 类加载机制 1. 概述 虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的 J ...
- [深入理解Java虚拟机]<自动内存管理>
Overview 走近Java:介绍Java发展史 第二部分:自动内存管理机制 程序员把内存控制的权利交给了Java虚拟机,从而可以在编码时享受自动内存管理.但另一方面一旦出现内存泄漏和溢出等问题,就 ...
- 深入理解Java虚拟机:垃圾收集器与内存分配策略
目录 3.2 对象已死吗 判断一个对象是否可被回收 引用类型 finalize() 回收方法区 3.3. 垃圾收集算法 1.Mark-Sweep(标记-清除)算法 2.Copying(复制)算法 3. ...
- 《深入理解Java虚拟机》学习笔记之内存分配
JVM在执行Java程序的过程中会把它所管理的内存划分若干个不同的数据区域,如下图: 大致可以分为两类:线程私有区域和线程共享区域. 线程私有区域 程序计数器(Program Counter Regi ...
- 深入理解Java虚拟机一:运行时数据区域
根据<Java虚拟机规范(第2版)>的规定,Java虚拟机管理的内存包括下图几个运行时数据区域: 1.程序计数器 程序计数器(Program Counter Register ...
- 深入理解JAVA虚拟机 自动内存管理机制
运行时数据区域 其中右侧三个一起的部分是每个线程一份,左侧两个是所有线程共享的. 程序计数器(Program Counter Register) 英文名称叫Program Counter Regist ...
- 深入理解Java虚拟机二:垃圾收集与内存分配
垃圾收集:垃圾收集要完成三件事,包括哪些内存需要回收,什么时候回收及如何回收. 1.需要回收的内存判定:没有引用指向原先分配给某个对象的内存时,则该内存是需要回收的垃圾 Java垃圾收集器在对内存进行 ...
- 《深入理解java虚拟机》读书笔记1--java内存区域
Java内存管理 本文主要介绍Java虚拟机运行时的内存区域是如何划分的.Java对象的创建过程.Java对象的内存布局.Java对象的访问定位 一:运行时区域划分 主要可以分为以下 几个: 程序计数 ...
- 深入理解Java虚拟机笔记——垃圾收集器与内存分配策略
目录 判断对象是否死亡 引用计数器算法 可达性分析算法 各种引用 回收方法区 垃圾收集算法 标记-清除算法 复制算法 标记-整理算法 分代收集算法 HotSpot算法实现 枚举根节点 GC停顿(Sto ...
随机推荐
- MariaDB 10.x 将包含多主复制功能
本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://www.penglixun.com/tech/database/multi_so ...
- foj 2139
hi.baidu.com/ydlqw/item/120cd21a5afd5becddeeca41?qq-pf-to=pcqq.c2c
- Nova和Heat中的servergroup
如今nova能够通过命令创建一个server group,在server group中的vm能够指定一些policy. 这些policy包含affinity和anti-affinity.affinit ...
- 改你MB需求!
改你MB需求! 原创 2015-12-08 尖峰视界 尖峰视界 我敏锐的觉察到,产品经理的头像開始闪动了.在0.1秒的时间内,我全身的血液都冲向了大脑.果然.右上角弹出了文件传输窗体. "最 ...
- Epos消费管理系统复制迁移SQL SERVER 2005数据库
先脱机 原来要关闭Epos消费管理系统软件才可以让对应的数据库脱机
- [Javascript] 40个轻量级JavaScript脚本库
诸如jQuery, MooTools, Prototype, Dojo和YUI等JavaScript脚本库,大家都已经很熟悉.但这些脚本库有利也有弊--比如说JavaScript文件过大的问题.有时你 ...
- postgresql 备份(pg_dump,pg_restore)
PG提供物理备份和逻辑备份(本篇主要讲逻辑备份)物理备份:WAL热备份逻辑备份:pg_dump,pg_dumpall,恢复时pg_restore 查看帮助命令: pg_dump --help 跟MyS ...
- 一步步教会你微信小程序的登录鉴权
前言 为了方便小程序应用使用微信登录态进行授权登录,微信小程序提供了登录授权的开放接口.乍一看文档,感觉文档上讲的非常有道理,但是实现起来又真的是摸不着头脑,不知道如何管理和维护登录态.本文就来手把手 ...
- Vue2.0框架搭建基础操作及目录说明
一.概述 vue.js是一套构建用户界面的渐进式框架.vue采用自底向上增量开发的设计.vue的核心库只关心视图层,非常容易学习,非常容易与其它库和已有项目整合.vue完全有能力驱动采用单文件组件和v ...
- Pop3协议详解
POP3全称为Post Office Protocol version3,即邮局协议第3版.它被用户代理用来邮件服务器取得邮件.POP3采用的也是C/S通信 模型 用户从邮件服务器上接收邮件的典型 ...