深入理解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. [ubuntu]为ubuntu设立“任务管理器”的组合键

    在windows下面,我们可以方便的使用ctrl+alt+delete调出任务管理器,那么在ubuntu下面如何实现呢?这里我们介绍两种方法:1.在终端下运行: 代码:gconf-editor 找到: ...

  2. android通过USB使用真机调试程序

    我的机子很老,开启个android模拟器都要好几分钟,但幸亏有个android的真机,这样直接在andriod手机上调试也是一个不错的选择.下面我就介绍 一下使用android手机来调试android ...

  3. Eclipse智能提示设置

    最近公司电脑上的Eclipse没有了自动提示功能,也不是全部不提示,大多数情况下按下“alt+/”键还会产生提示,但是当我在java项目中邪main方法和syso的时候,“alt+/”则会失效,今天在 ...

  4. java容器详细解析(转)

    :在java开发中我们肯定会大量的使用集合,在这里我将总结常见的集合类,每个集合类的优点和缺点,以便我们能更好的使用集合.下面我用一幅图来表示 其中淡绿色的表示接口,红色的表示我们经常使用的类. 1: ...

  5. MySQL 如何更新某个字段的值为原来的值加1

    格式:update 表名称 set 字段名称 = 字段名称 + 1 [ where语句] 比如说数据库中有一张student表,要想把id为1的学生成绩(score)加1则update student ...

  6. RHCE7 管理II-4计划将来的Linux任务

    (1) at 一次性的计划任务 语法: # at [参数] [时间] at> 执行的指令 退出at命令 ctrl+d [root@localhost ~]# at now at> mkdi ...

  7. Chrome 错误代码:ERR_UNSAFE_PORT

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

  8. Unix环境高级编程(十六)进程间通信

    进程间通信(IPC)是指能在两个进程间进行数据交换的机制.现代OS都对进程有保护机制,因此两个进程不能直接交换数据,必须通过一定机制来完成. IPC的机制的作用: (1)一个软件也能更容易跟第三方软件 ...

  9. I/O复用 - 各种不同的IO模型

    一.概述 我们看到上面的TCP客户同时处理两个输入:标准输入和TCP套接字.我们遇到的问题就是在客户阻塞于(标准输入上的)fgets调用期间,服务器进程会被杀死.服务器TCP虽然正确地给客户TCP发送 ...

  10. 局域网不同用户同时登录同一个网站,会出现session乱窜的问题

    出现这种问题的情景再现: 1.有一部分人访问网站会出现session乱窜的问题. 2.这部分人是在同一个局域网中. 3.不同菜单看到的信息是不同人的,或者同一个菜单翻页时有的时候看到的是自己的数据,有 ...