深入理解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虚拟机,从而可以在编码时享受自动内存管理.但另一方面一旦出现内存泄漏和溢出等问题,就 ...
随机推荐
- Java 12 骚操作, String居然还能这样玩!
Java 13 都快要来了,12必须跟栈长学起! Java 13 即将发布,新特性必须抢先看! 栈长之前在Java技术栈微信公众号分享过<Java 11 已发布,String 还能这样玩!> ...
- vooya --- a YUV player and a generic raw data player
vooya是一个raw数据播放器,可播放yuv数据,兼容win.linex以及mac平台. 下载地址:https://www.offminor.de/(见最下面) ubuntu需要安装依赖: apt ...
- git远程版本回退
本文为博主原创,未经允许不得转载: 之前在git提交版本时,发现将新开发的代码提交到了另一个分支上,为了不影响提交分支代码的 功能,需要回退到之前的版本. 在使用命令回退的时候,一直没有回退成功,有个 ...
- 系统重装之认识UEFI
UEFI是一种新型的引导方式?他与传统的BIOS引导不同,传统BIOS引导需要经过(开机→BIOS初始化→BIOS自检→引导系统→进入系统)五个步骤来完成引导操作,UEFI只需要(开机→UEFI初始化 ...
- IDEA中MyBatis插件的安装及使用
这个插件的好处就在于能自动关联mapper类与xml,让你可以快速的互相跳转,还能帮助你做简单的排错. 安装方法: 1.File→Settings→Plugins,输入mybatis plugin,本 ...
- 又一神器框架:linq.js
1.支持jQuery插件的方式.jquery.linq.min.js. 2.也可以像普通js方法一样使用.linq.min.js. 3.当然用习惯VS的童鞋肯定希望有个良好的智能感知,是的,它支持. ...
- [LeetCode] 355. Design Twitter 设计推特
Design a simplified version of Twitter where users can post tweets, follow/unfollow another user and ...
- 【SSH进阶之路】Spring的IOC逐层深入——为什么要使用IOC[实例讲解](二)
上篇博客[SSH进阶之路]Spring简介,搭建Spring环境——轻量级容器框架(一),我们简单的介绍了Spring的基本概念,并且搭建了两个版本的Spring开发环境,但是我们剩下了Spring最 ...
- 【视频开发】Nvidia硬解码总结
Nvidia硬解码总结 1.前言 本文的主要目的是对近期进行的nvidia硬件解码工作的记录和总结.至于为什么研究nvidia硬件解码的具体内容,其实主要是为了在项目中能够利用nvidia的硬件解码和 ...
- 【Python开发】PyInstaller打包Python程序
PyInstaller是一个能将Python程序转换成单个可执行文件的程序, 操作系统支持Windows, Linux, Mac OS X, Solaris和AIX.并且很多包都支持开箱即用,不依赖环 ...