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(一) -- 自动内存管理机制的更多相关文章

  1. JVM介绍&自动内存管理机制

    1.介绍JVM(Java Virtual Machine,Java虚拟机) JVM是Java Virtual Machine的缩写,通常成为java虚拟机,作为Java可以进行一次编写,到处执行(Wr ...

  2. 深入理解JAVA虚拟机 自动内存管理机制

    运行时数据区域 其中右侧三个一起的部分是每个线程一份,左侧两个是所有线程共享的. 程序计数器(Program Counter Register) 英文名称叫Program Counter Regist ...

  3. JVM自动内存管理机制——Java内存区域(上)

    一.JVM运行时数据区域概述 Java相比较于C/C++的一个特点就是,在虚拟机自动内存管理机制的帮助下,我们不需要为每一个操作都写像C/C++一样的delete/free代码,所以也不容易出现内存泄 ...

  4. JVM自动内存管理机制--读这篇就GO了

    之前看过JVM的相关知识,当时没有留下任何学习成果物,有些遗憾.这次重新复习了下,并通过博客来做下笔记(只能记录一部分,因为写博客真的很花时间),也给其他同行一些知识分享. Java自动内存管理机制包 ...

  5. 深入理解Java虚拟机(自动内存管理机制)

    文章首发于公众号:BaronTalk 书籍真的是常读常新,古人说「书读百遍其义自见」还是很有道理的.周志明老师的这本<深入理解 Java 虚拟机>我细读了不下三遍,每一次阅读都有新的收获, ...

  6. JVM自动内存管理机制——Java内存区域(下)

    一.虚拟机参数配置 在上一篇<Java自动内存管理机制——Java内存区域(上)>中介绍了有关的基础知识,这一篇主要是通过一些示例来了解有关虚拟机参数的配置. 1.Java堆参数设置 a) ...

  7. 【深入理解Java虚拟机】自动内存管理机制——垃圾回收机制

      Java与C++之间有一堵有内存动态分配和垃圾收集技术所围成的"高墙",墙外面的人想进去,墙里面的人却想出来.C/C++程序员既拥有每一个对象的所有权,同时也担负着每一个对象生 ...

  8. 【深入理解Java虚拟机】自动内存管理机制——内存区域划分

      Java与C++之间有一堵有内存动态分配和垃圾收集技术所围成的"高墙",墙外面的人想进去,墙里面的人却想出来.C/C++程序员既拥有每一个对象的所有权,同时也担负着每一个对象生 ...

  9. [深入理解Java虚拟机]<自动内存管理>

    Overview 走近Java:介绍Java发展史 第二部分:自动内存管理机制 程序员把内存控制的权利交给了Java虚拟机,从而可以在编码时享受自动内存管理.但另一方面一旦出现内存泄漏和溢出等问题,就 ...

随机推荐

  1. SpringBoot异步及线程池配置

    异步方法注解@Async 在SpringBoot中进行异步处理,可以使用异步注解@Async和@EnableAsync. @Async注解表示异步,如:@Async("asyncServic ...

  2. DATEADD (Transact-SQL)

    DATEADD (Transact-SQL) This function adds a specified number value (as a signed integer) to a specif ...

  3. 文献阅读 | A single-cell molecular map of mouse gastrulation and early organogenesis

    A single-cell molecular map of mouse gastrulation and early organogenesis Here we report the transcr ...

  4. flask 开发用户登录注册功能

    flask 开发用户登录注册功能 flask开发过程议案需要四个模块:html页面模板.form表单.db数据库操作.app视图函数 1.主程序 # app.py # Auther: hhh5460 ...

  5. 使用bert进行情感分类

    2018年google推出了bert模型,这个模型的性能要远超于以前所使用的模型,总的来说就是很牛.但是训练bert模型是异常昂贵的,对于一般人来说并不需要自己单独训练bert,只需要加载预训练模型, ...

  6. 【Git】The authenticity of host '192.168.1.1 (192.168.1.1)' can't be established.

    背景,在服务器用www用户身份 执行拉取命令报错 sudo -u www git pull 原因分析: 在新生成密钥之后,在.ssh文件夹中少了known_hosts文件 解决办法: Are you ...

  7. 【Js】单页面多个倒计时问题

    代码: <!DOCTYPE html> <html> <head> <title>多个timeout</title> <script ...

  8. C#程序打包安装部署之添加注册表项(转)

    今天为大家整理了一些怎样去做程序安装包的具体文档,这些文档并不能确保每个人在做安装包的时候都能正确去生成和运行,但是这些文档的指导作用对于需要的朋友来说还是很有必要的,在实际产品的安装部署过程中可能有 ...

  9. H2数据库介绍

    H2数据库是一个开源的关系型数据库. H2是一个采用java语言编写的嵌入式数据库引擎,只是一个类库(即只有一个 jar 文件),可以直接嵌入到应用项目中,不受平台的限制 应用场景: 可以同应用程序打 ...

  10. 玩转CONSUL(3)–大规模部署的性能开销定量分析

    1. 引言 今天有朋友问萌叔,consul能否在大规模生产环境下进行应用.场景是总计大约10w+台机器,分为3 ~ 4个机房,单个机房最多3w万+机器.这个问题大的,可把萌叔吓了跳,部门里面consu ...