深入理解JVM(一) -- 自动内存管理机制
Java运行时数据区域分为:程序计数器,虚拟机栈,本地方法栈,Java堆,方法区,运行时常量池,直接内存,结构如下:
1.程序计数器:
是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里(仅是概念模型),字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复等基础功能都要依赖这个计数器来完成。
由于Java虚拟机的多线程是通过线程轮流切换并分配cpu的处理时间的方式来实现的,所以在任意时刻,一个cpu都只会执行一个线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要一个独立的程序计数器,各个线程之间的程序计数器不会互相影响,独立存储,我们称这类内存区域为“线程私有“的内存。
如果线程执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果执行的是Native方法,这个计数器的值为空(Undefined)。此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemory情况的区域。
2.Java虚拟机栈:与程序计数器一样,Java虚拟机栈也是线程私有的,生命周期与线程一致。虚拟机栈描述的是Java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法出入口信息等,一个方法从调用到执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
局部变量表存储了编译器可预知的各种基本数据类型(int,byte,char,short,int,float,long,double),对象引用(refrence类型,不等同于对象本身,指向对象起始地址的引用指针)和returnAddress类型(指向了一条字节码指令的地址)。
这个区域所需要的内存大小是在编译器就确定的,在Java虚拟机规范中,对这个区域规定了两种异常:一是如果线程请求的栈深度大于虚拟机所允许的深度,将跑出StackOverFlowError异常。二是虚拟机栈动态扩展时如果无法申请到足够的内存,就会抛出OutOfMemoryError异常。
3.本地方法栈:与虚拟机栈发挥的作用相似,区别不过是虚拟机栈为虚拟机执行Java方法提供服务,而本地方法栈则为虚拟机执行Native方法服务。
4.Java堆:Java堆是Java虚拟机所管理的最大的一部分内存,堆是被所有线程共享的一块内存区域,在虚拟机启动时创建,它唯一的目的就是存放对象实例,几乎素有的对象实例都在这里分配内存。
堆是垃圾回收器(GC)主要管理的区域,堆可以划分为新年代和老年代,再细致一点有Eden空间,fromSurvivor空间,toSurvivor空间等。进一步的细分是为了在不同的空间针对其特征上采用不同的回收算法,更快的释放内存。堆可以物理上不连续,但是逻辑上连续,也是按照可扩展规范来实现的(通过-Xmx,-Xms来控制),当堆中没有内存能够完成内存分配并且堆已经不能再扩展时,就会抛出OutOfMemoryError异常。
5.方法区:与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息,常量,静态变量,与堆内必须执行大多数情况下可以将这部分区域理解为“永久代”,在该区域执行的回收一般是针对类的卸载和常量池的垃圾回收,当方法区无法满足内存分配的需求时,将会抛出OutOfMemoryError。
6.运行时常量池:是方法区的一部分。
7.直接内存:并不是虚拟机运行时数据的一部分,也不是Java规定的虚拟机规范中内存的范围内,在JDK1.4中引入了NIO(new I/O)类,可以使用native函数库直接分配堆外内存,当各个区域内存总和大于本机总内存且需要动态扩展时,会跑出OutOfMemoryError。
深入理解JVM(一) -- 自动内存管理机制的更多相关文章
- JVM介绍&自动内存管理机制
1.介绍JVM(Java Virtual Machine,Java虚拟机) JVM是Java Virtual Machine的缩写,通常成为java虚拟机,作为Java可以进行一次编写,到处执行(Wr ...
- 深入理解JAVA虚拟机 自动内存管理机制
运行时数据区域 其中右侧三个一起的部分是每个线程一份,左侧两个是所有线程共享的. 程序计数器(Program Counter Register) 英文名称叫Program Counter Regist ...
- JVM自动内存管理机制——Java内存区域(上)
一.JVM运行时数据区域概述 Java相比较于C/C++的一个特点就是,在虚拟机自动内存管理机制的帮助下,我们不需要为每一个操作都写像C/C++一样的delete/free代码,所以也不容易出现内存泄 ...
- JVM自动内存管理机制--读这篇就GO了
之前看过JVM的相关知识,当时没有留下任何学习成果物,有些遗憾.这次重新复习了下,并通过博客来做下笔记(只能记录一部分,因为写博客真的很花时间),也给其他同行一些知识分享. Java自动内存管理机制包 ...
- 深入理解Java虚拟机(自动内存管理机制)
文章首发于公众号:BaronTalk 书籍真的是常读常新,古人说「书读百遍其义自见」还是很有道理的.周志明老师的这本<深入理解 Java 虚拟机>我细读了不下三遍,每一次阅读都有新的收获, ...
- JVM自动内存管理机制——Java内存区域(下)
一.虚拟机参数配置 在上一篇<Java自动内存管理机制——Java内存区域(上)>中介绍了有关的基础知识,这一篇主要是通过一些示例来了解有关虚拟机参数的配置. 1.Java堆参数设置 a) ...
- 【深入理解Java虚拟机】自动内存管理机制——垃圾回收机制
Java与C++之间有一堵有内存动态分配和垃圾收集技术所围成的"高墙",墙外面的人想进去,墙里面的人却想出来.C/C++程序员既拥有每一个对象的所有权,同时也担负着每一个对象生 ...
- 【深入理解Java虚拟机】自动内存管理机制——内存区域划分
Java与C++之间有一堵有内存动态分配和垃圾收集技术所围成的"高墙",墙外面的人想进去,墙里面的人却想出来.C/C++程序员既拥有每一个对象的所有权,同时也担负着每一个对象生 ...
- [深入理解Java虚拟机]<自动内存管理>
Overview 走近Java:介绍Java发展史 第二部分:自动内存管理机制 程序员把内存控制的权利交给了Java虚拟机,从而可以在编码时享受自动内存管理.但另一方面一旦出现内存泄漏和溢出等问题,就 ...
随机推荐
- MySQL中的比较操作符<=>
对于=操作符,两个值被比较,结果是0(不相等)或者1(相等). 比较操作符<=>表示NULL安全的等价.这个比较操作符执行等价比较,和=操作符类似,但是如果两个操作数都是NULL,会返回1 ...
- 一款阿里开源的 Java 诊断工具
Arthas是什么鬼? Arthas是一款阿里巴巴开源的 Java 线上诊断工具,功能非常强大,可以解决很多线上不方便解决的问题. Arthas诊断使用的是命令行交互模式,支持JDK6+,Linux. ...
- PHP session_start() open failed: Permission denied session 无法使用的问题
日志显示报错如下: PHP message: PHP Warning: session_start(): open(/) 报错显示无法打开 seesion 文件,没有权限,所以需要给 /var/lib ...
- Laravel 入门常见问题汇总
一.安装完成后想打开 Laravel 内置的登录页面,报错 解决方法: Laravel 利用 PHP5.4 的新特性 trait 内置了非常完善好用的简单用户登录注册功能,适合一些不需要复杂用户权限管 ...
- 运维笔记--Linux查找指定目录下某段时间的文件
查找指定目录下,60天之前的文件:find /mnt/xml_data -mtime +60 -name "*.xml" 找到并统计数量:find /mnt/xml_data -m ...
- springMVC中controller的传参的几种案例
1.springmvc的controller方法不指定method时,默认get/post都支持 //@RequestMapping(value="test") //@Reques ...
- nodejs 管道判断
// 不优雅的判断管道判断 let d process.stdin.on('data', chunk => { d = String(chunk) }) setTimeout(() => ...
- bladex下载前端代码后,运行服务时报错【'vue-cli-service' 不是内部或外部命令,也不是可运行的程序或批处理文件。】的解决方法
问题:E:\BladeXDB\Saber>yarn run serveyarn run v1.13.0$ vue-cli-service serve'vue-cli-service' 不是内部或 ...
- Delphi ADOConnection连接
unit Unit_DM; interface usesSysUtils, Classes, DB, ADODB,inifiles,windows,forms,controls; typeTDM = ...
- NazoHell 攻略
http://hell.one-story.cn/hell-start.html Level 0: http://nazohell.one-story.cn/nazohell-start.html 跳 ...