JVM运行时数据区域 —— 程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区、运行时常量池

标签: JVM
5人阅读 评论(0) 收藏 举报
分类:

java虚拟机运行时数据区域的概括图如下所示:
这里写图片描述

下面将对运行时数据区进行讲解


程序计数器

1、说明:程序计数器可以看做是当前线程所执行的字节码的行号指示器。其实通俗点讲就是记录class文件运行到哪一行

2、注意的点:
(1)因为CPU执行时只能处理一个线程的代码,但是可能有多个线程在执行,所以需要记录每个线程执行到哪里,所以每个线程都有一个独立的程序计数器。所以这类区域是 “线程私有” 的内存
(2)此区域在Java虚拟机中是唯一一个没有 OutOfMemory 的区域


Java虚拟机栈

1、说明:Java虚拟机栈描述的是 Java 方法执行的内存模型。在每个方法执行时都会创建一个栈帧,用来存储局部变量表、操作数栈、动态链接、方法出口等信息。其实通俗来讲就是记录线程在执行方法过程中方法的相关信息

2、形象:一个方法执行完了就不在执行了,你可以想象一下,其实就是对应着栈这种数据结构的特点,方法调用时就入栈,方法执行完了就出栈

3、其实我们经常所说的 “堆栈” 中的栈指的就是这里,更确切的说是虚拟机栈中的局部变量表。

4、注意:该区域会抛出两种异常
(1)StackOverFlowError:如果线程请求的栈的深度超过虚拟机所允许的深度。因为栈你可以看做是一个井,往里边倒水,当水倒多了,水就溢出来了
(2)OutOfMemoryError:如果虚拟机栈的内存可以动态扩展且扩展时申请不到内存,那么就会报错

5、也是 线程不共享 的


本地方法栈

1、说明:本地方法栈(Native Method Stack)与虚拟机栈所发挥的作用是非常相似的,它们之间
的区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则为虚
拟机使用到的Native方法服务。

2、注意:该区域与Java虚拟机栈一样,都会抛出StackOverFlowError、OutOfMemoryError异常


Java堆

1、说明:java对是存放对象实例和数组的。是所有线程共享的。也是垃圾回收GC的主要区域

2、Java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可,就像我们的磁盘空间一样


方法区

1、说明:它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。方法区和堆一样,都是线程共享的。

2、除了和堆一样的内存数据可以不连续外,该区域可以不实现垃圾回收。该区域的内存回收主要是针对运行时常量池的回收和对类型的卸载


运行时常量池

1、说明:该区域是方法区中的一部分。主要用来存放编译期生成的各种字面量和符号引用

2、特性:运行时常量池具备动态性。如何理解呢?就比如 String 类的 intern() 方法。如果该字符串不在运行时常量池,那么会将该字符串保存到运行时常量池中,然后将该字符串的地址放回,你可以运行如下代码:

String aa = new String("aa");
String bb = new String("aa");
System.out.println(aa == bb);//false

String cc = new String("aa").intern();
String dd = new String("aa").intern();
System.out.println(cc == dd);//true

本文参考自:《深入理解Java虚拟机:JVM高级特性与最佳实践》

查看评论

Java内存模型 —— 深入JVM

-
  • 1970年01月01日 08:00

jvm虚拟机运行时内存分析,堆,栈,方法区,程序计数器,本地栈,常量池

**JVM自动内存管理机制** java内存区域与内存溢出异常 概述 : 对于从事C/C++程序开发的开发人员来说,在内存管理领域他们是拥有最高权力的皇帝又是从事最基础工作的劳动人民,即拥有每一...
  • m0_37034294
  • m0_37034294
  • 2017-12-19 17:18:25
  • 849

JVM内存模型程序计数器、虚拟机栈、本地方法栈、堆、方法区、运行时常量池、直接内存

java内存虚拟机主要分为程序计数器、java虚拟机栈、本地方法栈、java堆、方法区(方法区/运行时常量池)5大部分。1.程序计数器(Program Counter Register)    他记录...
  • wangaz521
  • wangaz521
  • 2018-02-11 17:18:22
  • 64

jvm内存分析 计数器 堆 栈 本地方法栈 方法区

jvm 堆 : 与程序计数器一样,Java虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,它的 生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个...
  • merrylilili
  • merrylilili
  • 2017-07-12 11:36:46
  • 770

【自动内存管理机制】(1)Java内存区域(方法区、虚拟机栈、本地方法栈、堆、程序计数器)与内存溢出异常

自动内存管理机制概述:Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙, 墙外面 的人想进去,墙里面的人却想出来。 1、对于C/C++开发人员,在内存管理领域,他们即使拥有最高...
  • qq_35415600
  • qq_35415600
  • 2017-05-19 14:02:54
  • 381

java-内存管理(程序计数器、虚拟机栈、本地方法栈、堆、方法区)和常量池

Java内存管理:深入Java内存区域1. 运行时数据区域Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,创建以及销毁时间,有的区域随着虚...
  • aimeimeiTS
  • aimeimeiTS
  • 2017-12-09 17:06:15
  • 193

深入Java虚拟机笔记--JVM内存区域

一,JVM 结构JVM 主要由类加载子系统, 运行时数据区(内存空间),执行引擎,以及本地方法接口等组成。其中运行数据区又包括 方法区,堆,Java栈,本地方法栈,程序计数器。有些区域随着虚拟机启动而...
  • u010293702
  • u010293702
  • 2015-04-14 16:04:59
  • 787

Java中的栈,堆,方法区和常量池

1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(对...
  • fuckluy
  • fuckluy
  • 2016-01-31 16:32:40
  • 9124

JVM6:Jvm程序计数器,Java栈,本地方法栈,本地方法接口

  • u012447768
  • u012447768
  • 2014-02-26 11:52:08
  • 325

Java虚拟机-----方法区和运行时常量池

方法区: 方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据(是唯一的数据)。当java虚拟机通...
  • sunshine__me
  • sunshine__me
  • 2015-11-23 11:37:47
  • 6927
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 1万+
    积分: 625
    排名: 8万+
    博客专栏
    最新评论