1. 程序计数器

当前线程所执行的字节码的行号指示器。

2. Java虚拟机栈

线程私有,与线程具有相同生命周期。用于存储局部变量表、操作数栈、动态链表、方法出口等信息

局部变量表存放内容:

  • 基本数据类型(boolean、byte、char、short、int、float、long、double)
  • 对象引用(区别于符号引用,符号引用存放在常量池)
  • returnAddress类型(指向一条字节码指令的地址)

64位长度的long和double类型数据占用2个局部变量空间(slot),其余占用1个slot。

两种异常:

  • StackOverflowError:线程请求的栈深度>虚拟机允许的深度
  • OutOfMemoryError: 动态扩展时无法申请到足够内存

3. 本地方法栈(Native Method Stack)

与虚拟机栈类似,区别是Native Method Stack服务于Native方法,而虚拟机栈服务于Java方法。

4. Java堆(Java Heap)

所有线程共享,存放对象实例、数组

垃圾收集器管理的主要区域,也称“GC堆(Garbage Collected Heap)”

包含新生代(Eden空间、From Survivor空间、To Survivor空间)、老生代。

可划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer,TLAB)。

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

可扩展:-Xmx和-Xms控制。-Xmx最大堆内存大小,-Xms初始堆内存大小。

当堆中没有可用内存完成实例分配,并且也无法再扩展时——OutOfMemoryError

5. 方法区(别名Non-Heap)

也是所有线程共享,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据

也称“永久代(Permanent Generation)”,但本质上并不等价。

永久代有-XX:MaxPermSize的上限。

6. 运行时常量池(Runtime Constant Pool)

属于方法区的一部分。

7. 直接内存(Direct Memory)

JDK1.4新加入的NIO(New Input/Output)类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/O方式,它可使用Native函数库直接分配堆外内存。不受Java堆大小(-Xmx)限制,从而可能造成各个内存区域总和大于物理内存限制而造成动态扩展时出现OutOfMemoryError。

小结:

  • 1、2、3三种内存区域是各个线程私有的
  • 4、5是所有线程共有的
  • 6是5的一部分
  • 7不是虚拟机运行时数据区的一部分,属于虚拟机的内存区域外的其他物理内存

JVM学习笔记一:Java运行时数据区域的更多相关文章

  1. JVM学习笔记:Java运行时数据区域

    JVM执行Java程序的过程中,会使用到各种数据区域,这些区域有各自的用途.创建和销毁时间.根据<Java虚拟机规范>,JVM包括下列几个运行时数据区域,如下图所示: 其中红色部分是线程私 ...

  2. 读书笔记-浅析Java运行时数据区

    作为一个 Java 为主语言的程序员,我偶尔也需要 用 C/C++ 写程序,在使用时让我很烦恼的一件事情就是需要对 new 出来的对象进行 delete/free 操作,我老是担心忘了这件事情,从而导 ...

  3. Java运行时数据区域分析

    Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结 ...

  4. JVM之基础概念(运行时数据区域、TLAB、逃逸分析、分层编译)

    运行时数据区域 JDK8 之前的内存布局 JDK8 之后的 JVM 内存布局 JDK8 之前,Hotspot 中方法区的实现是永久代(Perm),JDK8 开始使用元空间(Metaspace),以前永 ...

  5. Java运行时数据区域划分

    Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁时间.根据<Java虚拟机规范(Java SE 7版>的规定,J ...

  6. (二)、JAVA运行时数据区域

    根据<Java 虚拟机规范(Java SE 7版)>规定,Java虚拟机所管理的内存,将会包括以下几个运行时数据区域: 注: 1.由所有线程共享的数据区: 对应 java内存模型的主内存, ...

  7. 深入理解JVM虚拟机:(一)Java运行时数据区域

    概述 JVM是Java语言的精髓所在,因为它Java语言实现了跨平台运行,以及自动内存管理机制等,本文将从概念上介绍JVM内存的各个区域,说明个区域的作用. JVM运行时数据区模型 Java虚拟机在执 ...

  8. java运行时数据区域

    数据区域有:程序计步器,虚拟机栈,本地方法栈,java堆,方法区 程序计步器: 它是一块较小的内存空间,它的作用可以看做是当先线程所执行的字节码的信号指示器. 每一条JVM线程都有自己的PC寄存器,各 ...

  9. [JVM-1]Java运行时数据区域

    Java虚拟机(JVM)内部定义了程序在运行时需要使用到的内存区域 这些区域都有自己的用途,以及创建和销毁的时间.有些区域随着虚拟机进程的启动而存在,有的区域则依赖用户线程的启动和结束而销毁和建立. ...

随机推荐

  1. shell脚本实现anisble客户端脚本分发和密钥授权配置

    ##############################Deploy ansible client shell######################## echo "start d ...

  2. Three.js 学习笔记(1)--坐标体系和旋转

    前言 JavaScript 3D library The aim of the project is to create an easy to use, lightweight, 3D library ...

  3. 洛谷P1345 [USACO5.4]奶牛的电信Telecowmunication【最小割】分析+题解代码

    洛谷P1345 [USACO5.4]奶牛的电信Telecowmunication[最小割]分析+题解代码 题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流. ...

  4. Java经典编程题50道之十九

    打印出如下图案(菱形)        *      ***    ******  ********    ******      ***        * public class Example19 ...

  5. 阶乘之和 输入n,计算S=1!+2!+3!+…+n!的末6位(不含前导0)。n≤10 6 ,n!表示 前n个正整数之积。

    阶乘之和输入n,计算S=1!+2!+3!+…+n!的末6位(不含前导0).n≤10 6 ,n!表示前n个正整数之积.样例输入:10样例输出: package demo; import java.uti ...

  6. MySQL的InnoDB引擎与MyISAM引擎

    MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.与 ...

  7. Git版本控制的基本命令

    安装完了GIT首先要自报家门,否则代码不能提交 git config --global user.name "Your Name" git config --global user ...

  8. Mysql取随机数据效率测试(400W条中读取100条)

    测试数据表的创建在文章:http://www.cnblogs.com/wt645631686/p/6868192.html 先看一下我的SQL方案 SELECT * FROM `emp` WHERE ...

  9. window 环境变量保存位置在哪里?

    注册表-regedit.exe 用户变量: HKEY_CURRENT_USER\Environment 系统变量: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSe ...

  10. AC Dream1069

    这题的加密字符 - (Fibnacci % 26),如果得到的字符小于'a',就等于加密字符 - (Fibnacci % 26)+26. 获得题目的函数如下: void getItem(){ char ...