深入理解Java虚拟机 -- 读书笔记:JVM运行时数据区域

本文转载:http://blog.csdn.net/jubincn/article/details/8607790

本系列为《深入理解Java虚拟机 》(周志明著)读书笔记。

Java程序员一般都知道JVM中存在栈和堆的,并简单了解对象是在堆上分配的,这点从C/C++转过Java的程序员很容易想到。但Java由于其自身的特性,还有一些其他的内存区域,如下图所示:

程序计数器

程序计数器占用的内存空间不大,里面记录了各线程当前字节码的行号。JVM的多线程是通过轮流执行CPU时间的方式实现,因此在一个线程离开自己的CPU切片时,需要记录当前的状态(字节码行号)。为了防止线程之间相互影响,每条线程都有自己独立的程序计数器,这类内存区域也被称为“线程私有”内存。例如在上图中,虚拟机栈、本地方法栈和程序计数器都属于“线程私有”内存。
 
如果程序执行的是一个Java方法,程序计数器记录当前线程的字节码地址;如果执行的是一个本地方法,则程序计数器为空(undefined)。
 

Java虚拟机栈

Java程序员常说“栈”和“堆”,那个“栈”指的正是Java虚拟机栈。从上图可以看出,和程序计数器一样,Java虚拟机栈也是线程私有的,生命周期和线程一样。虚拟机栈存储的是栈帧(Stack Frame):包含局部变量表,操作数栈,动态链接和返回信息等。
 
局部变量表存放了编译期可知的各种基本数据类型(boolean, byte, char, short, int, float, long, double)、对象引用和ruturnAddress类型。从这里可以看出,使用Integer和int在内存空间的占用上是不同的。在32位机器中,Integer要占用一个reference(8 bytes) + 一个int(4字节), 而int则只占4字节自身的空间。在局部变量表中,8 bytes的long和double会占据2个局部变量空间(slot),其他类型只占据一个。
 

本地方法栈

本地方法栈和Java虚拟机栈在结构和用途上类似,所不同的是本地方法栈执行的是Native方法,Java虚拟机栈中执行的是Java(字节码)方法。
 

Java堆

Java堆是所有线程共享的一个区域,在虚拟机启动时创建。这个区域主要是用于存放对象实例,几乎所有的对象实例都是在堆中分配。Java堆是垃圾收集器(GC)管理的主要区域。因为很多垃圾回收器都采用“分代回收”的策略,因此Java堆还可以细分为:新生代和老生代。JVM规范规定Java堆只需在逻辑上连续,在物理上是否连续则无关紧要。

方法区

方法区与Java堆一样,是多个线程共享的区域,用于保存已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。相对而言,这个区域的内存很少需要回收,在这个区域的主要回收目标是针对常量池的回收和对类型的卸载。
 

运行时常量池

运行时常量池是方法区的一部分。Class文件中除了类版本、字段、方法、接口等描述性信息外,还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。
 
运行时常量池想对于Class文件常量池的另外一个重要特性是具备动态性,Java语言并不要求常量一定只能在编译期产生,也就是并非只有预置入Class文件中常量池的内容才能进入方法区运行时常量池,运行期间也可能将新的常量放入池中。
 

直接内存

直接内存并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中的一部分,但这部分常在NIO中提及。NIO基于通道(Channel)和缓冲区(Buffer),它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在Java堆和Native堆中来回复制数据。
 

深入理解Java虚拟机 -- 读书笔记(1):JVM运行时数据区域的更多相关文章

  1. JVM运行时数据区域

    上面已经聊过JVM是什么东东,也谈过了JVM内存的垃圾回收机制.这一篇博客我们来聊聊JVM运行时数据区域. JVM运行时数据区域由5块部分组成,分别是堆,方法区,栈,本地方法栈,以及程序计数器组成. ...

  2. JVM 运行时数据区域划分

    目录 前言 什么是JVM JRE/JDK/JVM是什么关系 JVM执行程序的过程 JVM的生命周期 JVM垃圾回收 JVM的内存区域划分 一.运行时数据区包括哪几部分? 二.运行时数据区的每部分到底存 ...

  3. 深入理解java虚拟机---读书笔记

    第一章 走近java 1. java 技术体系: java 程序设计语言 各种硬件平台上的java虚拟机 class 文件格式 java API 类库 来自商业机构或者开源机构的第三方java类库 j ...

  4. 深入理解java虚拟机读书笔记--java内存区域和管理

    第二章:Java内存区域和内存溢出异常 2.2运行时数据区域 运行时数据区分为方法区,堆,虚拟机栈,本地方法栈,程序计数器 方法区和堆是线程共享的区域 虚拟机栈,本地方法栈,程序计数器是数据隔离的数据 ...

  5. 深入理解java虚拟机读书笔记1--java内存区域

    Java在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途.创建和销毁的时间,有一些是随虚拟机的启动而创建,随虚拟机的退出而销毁,有些则是与线程一一对应,随 ...

  6. 深入理解Java虚拟机-JVM运行时数据区域

    一.运行时数据区域 1.程序计数器 程序计数器( Program Counter Register) 是一块较小的内存空间, 它可以看作是当前线程所执行的字节码的行号指示器. Java虚拟机的多线程是 ...

  7. JVM运行时数据区域详解

    参考文章: <Java Se11 虚拟机规范> <深入理解Java虚拟机-JVM高级特性与最佳实践 第3版>- 周志明 本文基于Java Se 11讲解. 根据<Java ...

  8. [jvm]运行时数据区域详解

    了解虚拟机是怎么使用内存的,有助于我们解决和排查内存泄漏和溢出方面的问题.详解java虚拟机内存的各个区域,分析这些区域的作用服务对象以及可能发生的问题. 一.运行时数据区域 java虚拟机在执行ja ...

  9. JVM 运行时数据区域

    Java虚拟机管理的内存包括以下几个运行时数据区域: 1.程序计数器: 程序计数器是一块比较小的内存空间,是当前线程执行的字节码行号指示器.Java多线程是通过线程轮流切换来实现的,所以每个线程都有一 ...

随机推荐

  1. [转载]在rhel 6 x86_64 上安装oracle 11g xe

    原文地址:在rhel 6 x86_64 上安装oracle 11g xe作者:pccom Oracle 11g xe for linux目前只有x86_64 版本,没有i386, i686 版本,如果 ...

  2. Mac环境 MySQL 和 MySQLWorkBench 破解版百度云下载

    最近有小伙伴下载,我正好保存有 正好分享一下 下载路径: Max环境下下载安装 1.下载完直接安装 MySQL安装后,这里可以查看 2.MySQLWorkBench安装完,桌面会有图标 打开后,用lo ...

  3. ADO,OLEDB,ODBC,DAO,RDO的区别说明

    http://www.jb51.net/article/31286.htm http://wenku.baidu.com/link?url=D7iis1tmkyXTCqjsezsvYtYHWG8jK- ...

  4. python学习笔记014——错误和异常

    Python有两种错误很容易辨认:语法错误和异常. 1 什么是语法错误 Python 的语法错误或者称之为解析错,是初学者经常碰到的,如下实例 if i>4 print("if语句输出 ...

  5. RMAN兼容性列表

    Target/Auxiliary Database RMAN Executable Catalog Database Catalog Schema 8.1.7.4 8.1.7.4 >=8.1.7 ...

  6. XtraTreeList直接显示Access数据库表中的数据

    方法1:点击在拖入的显示控件(TreeList)右上方的箭头,在Treelist任务中选择数据源,添加项目数据源,依次选择数据库.数据集,新建连接,浏览选择数据库(*.mdb),依次点击 下一步,选择 ...

  7. PLSQL_统计信息系列09_统计信息在不同数据库中迁移

    2014-01-05 Created By BaoXinjian

  8. fcntl 函数与文件锁

    一.fcntl函数 功能:操纵文件描述符,改变已打开的文件的属性 int fcntl(int fd, int cmd, ... /* arg */ ); cmd的取值可以如下: 复制文件描述符 F_D ...

  9. 浅析I/O模型

    以下是本文的目录大纲: 一.什么是同步?什么是异步? 二.什么是阻塞?什么是非阻塞? 三.什么是阻塞IO?什么是非阻塞IO? 四.什么是同步IO?什么是异步IO? 五.五种IO模型 六.两种高性能IO ...

  10. Java并发和多线程:序

      近期,和不少公司的"大牛"聊了聊,当中非常多是关于"并发和多线程"."系统架构"."分布式"等方面内容的.不少问题, ...