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

时间:2022-11-06 16:56:02

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

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

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

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

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

程序计数器

程序计数器占用的内存空间不大,里面记录了各线程当前字节码的行号。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. [jvm]运行时数据区域详解

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

  7. JVM 运行时数据区域

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

  8. 【Todo】深入理解Java虚拟机 读书笔记

    有一个在线系列地址 <深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)> http://book.2cto.com/201306/25426.html 已经下载了这本书(60多M ...

  9. 深入理解Java虚拟机读书笔记5----虚拟机字节码执行引擎

    五 虚拟机字节码执行引擎   1 运行时栈帧结构     ---栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,是虚拟机运行时数据区中的虚拟机栈的栈元素.     ---栈帧中存储了方法的局部变 ...

随机推荐

  1. 初学Python遇到的问题一二

    这篇文章只是学Python最最最基础的部分知识,如果你已经有过python经验,哪怕就一点点经验,或许你都遇到过,但相信这些问题对你来说早已不算问题了,所以请跳过吧,用你的时间去学习更多其他的知识就好 ...

  2. 高版本正方教务系统上传后缀过滤不严导致能直接上传Webshell

    在旧版本中有一个利用插件上传文件的漏洞,但是在新版本中已经没有了这个插件.这个漏洞是由于过滤不严造成的,可以直接上传Webshell进行提权,由于代码在DLL中,全国大部分高校均有此漏洞,影响范围很大 ...

  3. PHP 缓存扩展opcache

    opcache (全程 zend opcache): 从php5.5开始,默认提供的php脚本缓存扩展,编译php5.5时加上参数--enable-opcache就可以编译opcache了,只是要启用 ...

  4. &lbrack;Angular 2&rsqb; Simple intro Http

    To use http, we need to import the HTTP_PROVIDER, so that we can inject http to other component: imp ...

  5. 漂亮的代码3:flatten 一个数组

    看到一个题目: flatten([1,2,3]) // => [1,2,3] flatten([[1,2,3],["a","b","c&quot ...

  6. angular4&period;0微信oAuth第三方认证的正确方式

    当我们的项目运行在微信端时,用到oAuth第三方认证.问题来了,在ng4中微信认证应该放在哪里呢? 开始项目的时候,我将oAuth认证放在了每个页面模版中,发现返回历史页的时候,需要返回两次. 这个问 ...

  7. 【转】javascript 作用域链

    JavaScript函数的作用域链分为定义时作用域链和运行时作用域链: 函数被定义的时候,它有一个属性[[scope]]标明它的定义作用域链,定义时作用域链[[scope]]遵守这样的规则:一个函数的 ...

  8. setup FTP server on CentOS 7

    Setup FTP Server on CentOS 7 Install vsftpd vsftpd (Very Secure File Transport Protocol Daemon) is a ...

  9. 【转载】27&period;SpringBoot和SpringMVC的区别

    版权声明:本博客为记录本人JAVA自学之路而开,内容大多从网上学习与整理所得,若侵权请告知! https://blog.csdn.net/u014590757/article/details/7960 ...

  10. python通过openpyxl操作excel

    python 对Excel操作常用的主要有xlwt.xlrd.openpyxl ,前者xlwt主要适合于对后缀为xls比较进行写入,而openpyxl主要是针对于Excel 2007 以上版本进行操作 ...