区域简介

  JVM运行时区域有些随着虚拟机进程的启动而存在,有些依赖于用户线程的启动和结束而建立和销毁,大致分为以下几类:方法区,虚拟机栈,本地方法栈,堆,程序计数器,概念图如下(源于《深入理解JAVA虚拟机-JVM高级特性》):

  程序计数器

  当前线程所执行的字节码的行号指示器,是一块各个线程私有的内存,每个线程都有一个独立的程序计数器;

  如果线程执行的是一个JAVA方法,计数器记录的是虚拟机字节码指令的地址,如果执行的是一个Native方法,计数器值为空(Undefined);

  唯一一个在JVM规范中没有规定任何OOM情况的区域;

  虚拟机栈

  线程私有,每个线程执行时会创建一个栈桢(Stack Frame),包括局部变量表、操作数栈、动态链接、方法出口等信息,一个方法的调用过程对应着一个栈桢在虚拟机栈中的入栈和出栈操作;

  局部变量表:存放了编译期可知的各种基本数据类型(byte、short、char、int、long、float、double、boolean),对象引用(reference),returnAddress类型(指向了一条字节码指令的地址),64位的long和double占用两个Slot(局部变量空间),其他占用一个,局部变量表所需空间在编译期就确定;

  JVM规范中这个区域有两种异常情况,如果线程请求的栈深度大于虚拟机所允许的深度--抛出StackOverflowError,如果虚拟机栈可动态扩展但扩展时申请的内存无法满足--抛出OutOfMerroyError;

  本地方法栈

  与虚拟机栈作用类似,区别在于本地方法栈用于执行Native方法,JVM规范并未对此区域的实现做强制规定,具体的虚拟机可自由实现,此区域也会抛出StackOverflowError和OutOfMerroyError;

  堆

  所有线程共享的区域,几乎所有的对象实例都在这里分配内存,之所以是几乎,是因为JIT的优化技术已经使得部分对象实例不必在堆上分配;

  从内存分配的角度看,堆中可能划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer),目的是为了更好回收内存或更快的分配内存;

  逻辑上连续,物理上可以不连续;

  当堆中没有足够的内存完成对象实例的分配,且无法再扩展,会抛出OOM;

  方法区

  线程共享区域,用于存储已被虚拟机加载的类信息、常量、静态变量、JIT产生的代码等数据;

  HotSpot将永久代(Permanent Generation)作为方法区的实现,但本质上与方法区并不等价;

  不需要连续的内存,可扩展,可以选择不实现垃圾收集(GC只是hotspot在此区域实现的功能),当无法满足内存分配需求时,会抛出OOM;

  运行时常量池:Class文件中的常量池--用于存放编译期生成的各种字面量和符号引用--将在类加载后进入方法区的运行时常量池,除此之外还会把翻译出来的直接引用也存入,相对于Class文件常量池的特征是动态性,运行期间也可以将新的常量放入,如String.intern();

  直接内存

  此区域并不在JVM区域划分范围中,但这部分也可能会抛出OOM,NIO可以通过Native函数库直接分配堆外内存并通过DirectByteBuffer对象对这块内存进行操作,因为免了数据在Native堆和Java堆之间的复制从而提高性能;

JVM知识总结-运行时区域划分的更多相关文章

  1. JVM探秘1--JVM内存运行时区域划分

    Java程序员一般不需要太关注内存,因为操作内存的权力都交给了Java虚拟机,但是Java程序员必须需要了解JVM是如何使用内存的,否则一旦内存出现泄漏或事溢出的话,就会一筹莫展不知道从哪去入手排查问 ...

  2. JVM运行时区域详解。

    我们知道的JVM内存区域有:堆和栈,这是一种泛的分法,也是按运行时区域的一种分法,堆是所有线程共享的一块区域,而栈是线程隔离的,每个线程互不共享. 线程不共享区域 每个线程的数据区域包括程序计数器.虚 ...

  3. Java运行时内存划分与垃圾回收--以及类加载机制基础

    ----JVM运行时内存划分----不同的区域存储的内容不同,职责因为不同1.方法区:被线程共享,存储被JVM加载的类的信息,常量,静态变量等2.运行时常量池:属于方法区的一部分,存放编译时期产生的字 ...

  4. JVM三部曲之运行时数据区 (第一部)

    在接下来的几天想总结下,JVM相关的一些内容,比如下面的这三个内容算是比较核心知识点了 1.运行时数据区域: 在运行时数据区里存储类Class文件元数据(方法区),对象和数组(堆),方法参数局部变量( ...

  5. JVM之Java运行时数据区(线程共享区)

    JVM运行时区域各线程共享的区域包括堆区和方法区. 堆区 堆区最最主要的功能是存储对象实例[上篇也提到过],因此Java垃圾回收的主要战场就是在堆区,因此也有称为GC堆区.如果堆区的内存不够会出现Ou ...

  6. 【基本功】Java动态追踪技术探究 不重启JVM,替换掉已经加载的类?不重启JVM,获知运行时对象的属性

    https://mp.weixin.qq.com/s/_hSaI5yMvPTWxvFgl-UItA 小结: 1.根据Java的类加载机制,在同一个ClassLoader中,类是不允许重复的: 2.单例 ...

  7. 一. JVM发展史,运行时数据区域,四大引用

    一.JVM的出现 JVM将字节码解释成不同os下的机器指令,有了jvm,java语言在不同平台上运行时不需要重新编译 虚拟机发展史 (1)Sun Classic classic jvm要么采用纯解释器 ...

  8. JAVA虚拟机运行时内存划分--运行时数据区域

    Java虚拟机在执行java程序时会把内存划分为以下几个不同的数据区域: java虚拟机内存划分(运行时)1.线程私有的: 程序计数器(Program Counter Register):可以看作当前 ...

  9. 理解JVM之JAVA运行时内存区域

    java运行时内存区域划分为方法区,堆区,虚拟机栈区,本地方法栈,程序计数器.其中方法区跟堆区是线程共享的数据区,其他的是线程私有的数据区. 1.程序计数器 程序计数器(PC)是一块较小的内存,他是存 ...

随机推荐

  1. 关于cdn原理(就是内容分发网络)

    cdn,我理解其本质就是为了解决距离远产生的速度问题,使用就近的服务. 从中国请求美国一台服务器上的图片.一般比较慢,因为距离这么远,网络传输是存在损耗的,距离越远,传输的时间就越长.一般会看到浏览器 ...

  2. Oracle下Delete语句

    Delete语句 基本语法: delete from 表名 where 条件 注意事项: 1,如果不使用where子句,将表中所有数据全部删除 delete from test; 2,如果要删除某列的 ...

  3. htop 分析 进程对资源的消耗

    [root@d ~]# htop -hhtop 2.2.0 - (C) 2004-2018 Hisham MuhammadReleased under the GNU GPL. -C --no-col ...

  4. Django权限系统auth模块详解

    转自:原文出处 auth模块是Django提供的标准权限管理系统,可以提供用户身份认证, 用户组和权限管理. auth可以和admin模块配合使用, 快速建立网站的管理系统. 在INSTALLED_A ...

  5. D2 Magic Powder -1/- 2---cf#350D2(二分)

    题目链接:http://codeforces.com/contest/670/problem/D2 This problem is given in two versions that differ ...

  6. mysql修改端口经验

    mysql更改端口修改/etc/my.cnf添加port=3308修改后如下[mysqld]datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.sock ...

  7. React package.json详解

    概述: 每个项目的根目录下面,一般都有一个package.json文件,定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称.版本.许可证等元数据).npm install命令根据这个配置文件 ...

  8. 2.3 The Object Model -- Computed Properties

    一.What are computed properties? 1. 简而言之,计算属性让你声明函数为属性.你通过定义一个计算属性作为一个函数来创建一个,当你请求这个属性时,Ember会自动调用这个f ...

  9. 运行javac 报告javac不是内部或外部命令,但是运行java、java-version正常

    以前装jdk 从来没遇到过今天这种情况,各种解决办法试了一下午,终于出来了,说一下解决的办法: JAVA_HOME .classpath 都在系统变量中建立好: java_home 添加jdk的安装目 ...

  10. vs2010中如何编写C语言程序

    File->New->Project 在打开的New Project对话框中最左侧一栏中选择Visual C++下面的CLR,之后在其右侧的区域中选择CLR Empty Applicati ...