JVM学习(一)Java虚拟机运行时数据区域
一、Java内存区域
1、运行时数据区域
根据《Java 虚拟机规范(Java SE 7 版)》规定,Java 虚拟机所管理的内存包括以下几个运行时数据区域:

1.1 程序计数器
程序计数器是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器。字节码解释器在执行时通过改变计数器的值来选取下一条要执行的字节码的指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成
程序计数器是线程私有的内存区域
此内存区域是唯一一个Java虚拟机规范中没有规定任何OOM(OutofMemoryError)的区域
1.2 虚拟机栈
Java虚拟机栈也是线程私有的内存区域,他的生命周期与线程相同
描述的是 Java 方法执行的内存模型:每个方法在执行时都会床创建一个栈帧(Stack Frame)用于存储
局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行结束,就对应着一个栈帧从虚拟机栈中入栈到出栈的过程。局部变量表:
存放了编译期可知的各种基本类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference 类型)和 returnAddress 类型(指向了一条字节码指令的地址)
两种异常情况:
如果线程请求的栈深度大于虚拟机所允许的深度,就会抛出StackOverflowError异常
如果虚拟机栈可以动态扩展,而扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常
1.3 本地方法栈
线程私有。本地方法栈与虚拟机栈发挥的作用是非常相似的,区别在于Java虚拟机栈是为Java方法(也就是字节码)服务的,而本地方法栈是为虚拟机使用到的native方法服务的
两种异常也与Java虚拟机栈相同:StackOverflowError、OutOfMemoryError
1.4 Java堆
对于大多数应用来说,Java堆是虚拟机所管理的内存区域中最大的一块,Java堆是被所有线程共享的一块内存区域
唯一目的就是存放对象实例,所有的对象实力与数组都在堆上分配
Java堆是垃圾回收器管理的主要内存区域,因此 很多时候也被称作“GC堆”
Java堆可以处于物理上不连续的内存空间中,只要逻辑上连续即可
如果堆内存中没有内存完成实例分配,并且堆也无法在扩展时,就会抛出OutOfMemoryError异常
1.5 方法区
是所有线程共享的,存储类信息、常量、静态变量和及时编译器编译后的代码等数据
根据Java规范规定,当方法区无法满足内存的分配需求是,将会抛出OutOfMemoryError异常
1.6 运行时常量池
运行时常量池是方法区的一部分,存放编译期间生成的各种字面量和符号引用,这部分将在类加载后进入方法区的运行时常量池存放
当常量池无法在申请到内存是,将会抛出OutOfMemoryError异常
1.7 直接内存
在 JDK 1.4 中新加入 NIO (New Input/Output) 类,引入了一种基于通道(Channel)和缓存(Buffer)的 I/O 方式,它可以使用 Native 函数库直接分配堆外内存,然后通过一个存储在 Java 堆中的 DirectByteBuffer 对象作为这块内存的引用进行操作。可以避免在 Java 堆和 Native 堆中来回的数据耗时操作。
会受到本机内存限制,如果内存区域总和大于物理内存限制从而导致动态扩展时,将会抛出OutOfMemoryError异常
JVM学习(一)Java虚拟机运行时数据区域的更多相关文章
- 关于Java虚拟机运行时数据区域的总结
Java虚拟机运行时数据区域 程序计数器(Program Counter) 程序计数器作为一个概念模型,这个是用来指示下一条需要执行的字节码指令在哪. Java的多线程实际上是通过线程轮转做到的,如果 ...
- Java虚拟机-运行时数据区域
Java虚拟机管理的内存包括如图所示的运行时数据区域: 下面分别进行介绍: 1)程序计数器(Program Counter Register) 占用的内存空间比较小,主要作用就是标识当前线程执行的字节 ...
- Java虚拟机运行时数据区域划分
Java虚拟机数据运行时区域 方法区(Method Area) 存储加载的类信息,常量,静态变量,编译器编译后的代码等数据.虽然JVM规范把方法区描述为堆的一个逻辑部分,但它却有一个别名叫做N ...
- Java虚拟机运行时数据区域及垃圾回收算法
程序计数器 记录正在执行的虚拟机字节码指令的地址(如果正在执行的是本地方法则为空). Java 虚拟机栈 每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表.操作数栈.动态链接.方法出口 ...
- JDK1.8-Java虚拟机运行时数据区域和HotSpot虚拟机的内存模型
目录 介绍 官方文档规定的运行时数据区域 程序计数器 Java虚拟机栈 本地方法栈 虚拟机栈和本地方法栈溢出 Java堆 演示堆内存溢出 方法区 运行时常量池 演示方法区溢出 HotSpot虚拟机的内 ...
- 面试常问的 Java 虚拟机运行时数据区
写在前面 本文描述的有关于 JVM 的运行时数据区是基于 HotSpot 虚拟机. 概述 JVM 在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以 ...
- Java虚拟机运行时数据区
运行时数据区程序计数器Java虚拟机栈本地方法栈Java堆(GC堆)方法区运行时常量池 运行时数据区 Java虚拟机在运行Java程序时,会将它所管理的内存划分为若干个内存区域.这些数据区域有各自的用 ...
- Java 虚拟机运行时数据区
写在前面 本文描述的有关于 JVM 的运行时数据区是基于 HotSpot 虚拟机. 概述 JVM 在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以 ...
- 《深入理解Java虚拟机》(二)Java虚拟机运行时数据区
Java虚拟机运行时数据区 详解 2.1 概述 本文参考的是周志明的 <深入理解Java虚拟机>第二章 ,为了整理思路,简单记录一下,方便后期查阅. 2.2 运行时数据区域 Java虚拟机 ...
随机推荐
- C语言指针方法对字符串进行去重
自己编写了3种方法,都是使用指针的.(在LR中编写的) 1.先在原字符串进行比较,然后再放入目标字符串 Action() { char *srt="aadfeedeewwffggecccew ...
- Spring基础环境搭建所需要的jar包
红色标明的jar包.是spring框架开发的基础jar包. 必要jar包. spring-core-4.1.6.RELEASE.jar 框架核心jar包. spring-beans-4.1.6.REL ...
- jboss虚拟机快照
若使用jboss,则一定要记得隔断时间拍一个快照,这样如果虚拟机坏了,则可以进行回复快照,避免再次花时间去解决问题. 拍快照:启动虚拟机,然后,操作如下. 选择,current State,右击,则可 ...
- Jmeter Web 性能测试入门 (六):Jmeter 解析 response 并传递 value
解析response中的内容,并把获取到的value传递到后续的request中,常用的方法就是在想要解析response的request上添加后置处理器 本章介绍两种常用的组件 BeanShell ...
- ionic serve 报【ionic-app-scripts' 不是内部或外部命令 】问题解
Error: Cannot find module 'E:\angular\ionic0515\node_modules\@ionic\app-scripts' at Function.Modu ...
- DELPHI10.3.1安卓照相
DELPHI10.3.1安卓照相 解决方法:
- Mybatis generator配置
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration ...
- 多线程循环打印ABC
主要是利用线程的wait()和notify()来实现 public class MyThread implements Runnable { private String name; private ...
- JMeter首金网自营项目-转义及数据库数据乱码的解决
param的string参数: 需要对”进行转义,加/ { "prdCreditInfo": { "revision": 0, "maxCredit& ...
- kotlin创建类的实例
Java 中使用new关键字,但是在kotlin中调用函数和创建类的实例直接省略new 比如 new myClass()变成类myClass()