深入理解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虚拟机,从而可以在编码时享受自动内存管理.但另一方面一旦出现内存泄漏和溢出等问题,就 ...
随机推荐
- tomcat启动报错java.lang.OutOfMemoryError:PermGen space解决办法
tomcat启动错误提示: 严重: Error waiting for multi-thread deployment of WAR files to completejava.util.concur ...
- Java-JUC(十二):有3个线程。线程A和线程B并行执行,线程C需要A和B执行完成后才能执行。可以怎么实现?
方案(一)CountDownLatch: 使用CountDownLatch+Semaphore方式实现: import java.util.concurrent.CountDownLatch; imp ...
- mysql查询、子查询、连接查询
mysql查询.子查询.连接查询 一.mysql查询的五种子句 where子句(条件查询):按照“条件表达式”指定的条件进行查询. group by子句(分组):按照“属性名”指定的字段进行分组.gr ...
- WebGL调试工具分享
学习WebGL,我们需要一些好用的调试工具,下面分享3个常用的调试工具. WebGL Inspector 下载地址:https://github.com/benvanik/WebGL-Inspecto ...
- Python高级笔记(九)Python使用MySQL
1. MySQL基本使用 1.1 数据库简介 Mysql: 关系型数据库,做网站 redis:当作缓存 mongodb:非关系型数据库,做爬虫 SQL语句: DQL:数据查询语言,用于对数据进行查询, ...
- ADB命令使用大法
前言 Android开发调试工具ADB的使用.ADB(Android Debug Bridge)是Android SDK中的一个工具, 使用ADB可以直接操作管理Android模拟器或者真实的And ...
- xshell的ssh连接频繁提示Socket error Event: 32 Error: 10053(待验证)
修改/etc/ssh/sshd_config下的配置文件 将ClientAliveInterval的值修改为60 然后重启ssh服务器 目前没有在频繁出现ssh断开问题了,应该是有效的
- UUID算法系列各自有何优缺点( UUID1--UUID5)
UUID具有以下涵义: 经由一定的算法机器生成为了保证UUID的唯一性,规范定义了包括网卡MAC地址.时间戳.名字空间(Namespace).随机或伪随机数.时序等元素,以及从这些元素生成UUID的算 ...
- hadoop进阶---hadoop性能优化(一)---hdfs空间不足的管理优化
Hadoop 空间不足,hive首先就会没法跑了,进度始终是0%. 将HDFS备份数降低 将默认的备份数3设置为2. 步骤:CDH–>HDFS–>配置–>搜索dfs.replicat ...
- 微设计基础架构(MDI)
微设计基础架构(MDI) 了解微设计基础架构(MDI)的概念,它们如何帮助开发,以及它们与DevOps和微服务等技术的关系. 技术决策既困难又严肃,可以决定项目的成败.如何找到合适的技术栈?“微设计基 ...