一、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虚拟机运行时数据区域的更多相关文章

  1. 关于Java虚拟机运行时数据区域的总结

    Java虚拟机运行时数据区域 程序计数器(Program Counter) 程序计数器作为一个概念模型,这个是用来指示下一条需要执行的字节码指令在哪. Java的多线程实际上是通过线程轮转做到的,如果 ...

  2. Java虚拟机-运行时数据区域

    Java虚拟机管理的内存包括如图所示的运行时数据区域: 下面分别进行介绍: 1)程序计数器(Program Counter Register) 占用的内存空间比较小,主要作用就是标识当前线程执行的字节 ...

  3. Java虚拟机运行时数据区域划分

        Java虚拟机数据运行时区域 方法区(Method Area) 存储加载的类信息,常量,静态变量,编译器编译后的代码等数据.虽然JVM规范把方法区描述为堆的一个逻辑部分,但它却有一个别名叫做N ...

  4. Java虚拟机运行时数据区域及垃圾回收算法

    程序计数器 记录正在执行的虚拟机字节码指令的地址(如果正在执行的是本地方法则为空). Java 虚拟机栈 每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表.操作数栈.动态链接.方法出口 ...

  5. JDK1.8-Java虚拟机运行时数据区域和HotSpot虚拟机的内存模型

    目录 介绍 官方文档规定的运行时数据区域 程序计数器 Java虚拟机栈 本地方法栈 虚拟机栈和本地方法栈溢出 Java堆 演示堆内存溢出 方法区 运行时常量池 演示方法区溢出 HotSpot虚拟机的内 ...

  6. 面试常问的 Java 虚拟机运行时数据区

    写在前面 本文描述的有关于 JVM 的运行时数据区是基于 HotSpot 虚拟机. 概述 JVM 在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以 ...

  7. Java虚拟机运行时数据区

    运行时数据区程序计数器Java虚拟机栈本地方法栈Java堆(GC堆)方法区运行时常量池 运行时数据区 Java虚拟机在运行Java程序时,会将它所管理的内存划分为若干个内存区域.这些数据区域有各自的用 ...

  8. Java 虚拟机运行时数据区

    写在前面 本文描述的有关于 JVM 的运行时数据区是基于 HotSpot 虚拟机. 概述 JVM 在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以 ...

  9. 《深入理解Java虚拟机》(二)Java虚拟机运行时数据区

    Java虚拟机运行时数据区 详解 2.1 概述 本文参考的是周志明的 <深入理解Java虚拟机>第二章 ,为了整理思路,简单记录一下,方便后期查阅. 2.2 运行时数据区域 Java虚拟机 ...

随机推荐

  1. 内存管理2-@class关键字

    Review: 给对象发送消息,进行相应的计数器操作. Retain消息:使计数器+1,改方法返回对象本身 Release消息:使计数器-1(并不代表释放对象) retainCount消息:获得对象当 ...

  2. ubuntu14.04重启网卡的三种方法

    Linux重启网卡的三种方法: 一.network 利用root帐户 # service network restart 或者/etc/init.d/networking restart 二.ifdo ...

  3. ImportError: No module named rospy

    Traceback (most recent call last): File "manage.py", line 4, in <module> import rosp ...

  4. 动态规划——区间DP,计数类DP,数位统计DP

    本博客部分内容参考:<算法竞赛进阶指南> 一.区间DP 划重点: 以前所学过的线性DP一般从初始状态开始,沿着阶段的扩张向某个方向递推,直至计算出目标状态. 区间DP也属于线性DP的一种, ...

  5. Pro*C编程研究一:从.pc到.exe

    [第一步]在Windows下编辑一个.pc程序(Pro*C源程序,作者用到:C:\proctest\exam1.pc),其内容如下: #include <stdio.h> #include ...

  6. hey is a tiny program that sends some load to a web application.

    hey is a tiny program that sends some load to a web application. DOS attack DOS攻击生成 https://github.c ...

  7. Smarty 获取当前日期时间和格式化日期时间

    在Smarty 中获取当前日期时间和格式化日期时间与PHP中有些不同的地方,这里就为您详细介绍: 首先是获取当前的日期时间:在PHP中我们会使用date函数来获取当前的时间,实例代码如下:date(& ...

  8. CSS - clearfix清除浮动

    首先,我们来解释一下为什么要使用 clearfix(清除浮动). 通常我们在写html+css的时候,如果一个父级元素内部的子元素是浮动的(float),那么常会发生父元素不能被子元素正常撑开的情况, ...

  9. lua调用的c函数模块命名规则

    比如lua中调用C函数 socket.core() , 在c中需要这样命名:luaopen_socket_core(); 基本模式是添加luaopen_前缀,讲.变为_

  10. MATLAB绘图及例子总结

    MATLAB绘图及例子总结 二维图 例 1 X1=[1,2,4,6,7,8,10,11,12,14,16,17,18,20]; Y1=[1,2,4,6,7,8,10,10,8,7,6,4,2,1]; ...