深入理解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. swift上传图片

    import UIKit import AFNetworking class YJRequest: NSObject { //#pragma mark - 上传图片 func uploadImageW ...

  2. HDUOJ-----2571跳舞毯

    跳舞毯 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  3. HDUOJ-----2068RPG的错排

    RPG的错排 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  4. 【LeetCode】45. Jump Game II

    Jump Game II Given an array of non-negative integers, you are initially positioned at the first inde ...

  5. Windows下面安装和配置Solr 4.9(一)

       1.Solr下载 下载地址 :http://lucene.apache.org/solr/   2.解压,测试 在example文件夹中找到start.jar文件,用命令提示符运行这个文件:ja ...

  6. Chrome 错误代码:ERR_UNSAFE_PORT

    最近在用Nginx发布多个站点测试,使用了87.88端口, 88端口访问正常,87端口就怎么也访问不了, 点击更多,提示错误代码:ERR_UNSAFE_PORT 不安全的端口?尼玛就只靠端口就能解决不 ...

  7. VS2010中遇到_WIN32_WINNT not defined

    VS2010中编程时遇到这个问题 _WIN32_WINNT not defined. Defaulting to _WIN32_WINNT_MAXVER (see WinSDKVer.h) 解决办法: ...

  8. 常用IP核

    前言 记录自己用到的模块,随时补充. 主要分类: 一.常用模块 1-FIFO FIFO分为两种,一是输入输出时钟相同(Common clock)的 fifo ;二是输入输出时钟不相同(Independ ...

  9. 一定不要在头文件中using namespace XXX

    一定不要在头文件中using namespace XXX,这样会造成名字空间污染,引发ambiguous错误,又难以定位.

  10. js检查页面上有无重复id的代码分享

    用js代码检查一个页面上是否用重复的id. 方法一: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" ...