jvm在执行Java程序时,会把它所管理的内存划分为若干个不同的数据区。这些区域都有各自的用途,以及创建和销毁的时间。

有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。

一、程序计数器(线程私有)

看做当前线程所执行的行号指示器。字节码解释器工作时就是通过改变这个计数器的值类选取下一条需要执行的字节码指令。

线程私有

如果线程正在执行Java方法,计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Native方法,这个计数器则为空。

此内存区域是唯一一个JVM规范中没有规定任何OutOfMemoryError情况的区域。

二、Java虚拟机栈(线程私有)

虚拟机栈描述的是Java方法执行的内存模型。

每个方法执行时会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。

JVM规范中,这个区域规定了两种异常状况:线程请求的栈深度大于吸泥机所允许的深度,将抛出StackOverflowError异常;如果虚拟机栈可以动态扩展,扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常。

三、本地方法栈(线程私有)

与虚拟机栈所发挥的作用是非产相似的。、

区别在于虚拟机栈执行Java方法服务;而本地方法栈则为虚拟机使用到的Native方法服务。

与虚拟机栈一样,本地方法栈也会抛出上述相同的异常。

四、Java堆(线程共享)

对大多数应用说,Java堆是Java虚拟机所管理的内存中最大的一块。在虚拟机启动时创建。

目的是存放对象实例。jvm规范中描述:所有的对象实例以及数组都在堆上分配。

Java堆也是垃圾收集器管理的主要区域。(现在收集器基本都采用分代回收算法,所以可分为新生代,老年代)

这里主要说明内存区域的作用,Java堆上的上述各个区域的分配、回收等随后说明。

从内存共享的角度看,线程共享的Java堆可以划分多个线程私有的分配缓冲区(TLAB)。不过无论如何划分,都和存放内容无关,无论哪个区域,存储的都仍是对象实例。进一步划分的目的是:更好的回收内存、更快的分配内存。

最后:

1、Java堆可以处于物理上不连续的内存空间中,只要是逻辑上连续即可。

2、在实现时,既可以实现固定大小的,也可以是可扩展的。

3、当前主流的JVM都是可扩展的堆实现。如果堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常。

五、方法区(线程共享)

用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

习惯在HotSpot虚拟机上开发、部署程序的开发者来说,很多人将方法区称为永久代,本质上不等价,仅仅是Hotspot虚拟机的设计团队选择吧GC分代收集扩展到方法区。(或者说用永久代来实现方法区,这样Hotspot的垃圾收集器可以像管理Java堆一样管理者部分内存,省去了专门为方法区编写内存管理工作的代码)

Java内存区域-- 运行时数据区域的更多相关文章

  1. JVM 内存区域 (运行时数据区域)

    JVM 内存区域 (运行时数据区域) 链接:https://www.jianshu.com/p/ec479baf4d06 运行时数据区域 Java 虚拟机在执行 Java 程序的过程中会把它所管理的内 ...

  2. 想买保时捷的运维李先生学Java性能之 运行时数据区域

    前言 不知道自己不知道,不知道自己知道,知道自己不知道,知道自己知道,目前处于知道自己不知道这个阶段,很痛苦啊,干了4年了运维,是一个坎.越来越发觉想要走得远,还是得扎根底.   一.运行时数据区域 ...

  3. 深入理解Java虚拟机-JVM运行时数据区域

    一.运行时数据区域 1.程序计数器 程序计数器( Program Counter Register) 是一块较小的内存空间, 它可以看作是当前线程所执行的字节码的行号指示器. Java虚拟机的多线程是 ...

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

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

  5. java内存结构(执行时数据区域)

    java虚拟机规范规定的java虚拟机内存事实上就是java虚拟机执行时数据区,其架构例如以下: 当中方法区和堆是由全部线程共享的数据区. Java虚拟机栈.本地方法栈和程序计数器是线程隔离的数据区. ...

  6. Java内存区域与内存溢出异常---运行时数据区域

    运行时数据区域 Java虚拟机所管理的内存将会包括以下几个运行时数据区域 线程私有区域 1.程序计数器   程序计数器记录的是当前正在执行的虚拟机字节码指令所在的地址.在虚拟机的概念模型中,字节码解释 ...

  7. Java内存区域(运行时数据区域)和内存模型(JMM)

    Java 内存区域和内存模型是不一样的东西,内存区域是指 Jvm 运行时将数据分区域存储,强调对内存空间的划分. 而内存模型(Java Memory Model,简称 JMM )是定义了线程和主内存之 ...

  8. Java内存区域(运行时数据区域)详解、JDK1.8与JDK1.7的区别

    2.1 概述 对Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每个对象的new操作去写配对的delete/free 代码,不容易出现内存泄露和内存溢出的问题.不过,仍然需要Java虚 ...

  9. Java虚拟机所管理的内存,包含的运行时数据区域?

    运行时数据区域 线程私有(随用户线程的启动和结束而建立和销毁)或所有线程共享(随虚拟机进程的启动而存在) 抛出的异常 备注 程序计数器(Program Counter Register) 线程私有 唯 ...

随机推荐

  1. 「c++小学期」实验题目及代码

    面向对象编程的C++,和平时做题用的C++还是有差距的.实验的题目都是小题目,就都做一下吧.(没放代码的为要验收的 实验一 简单C++程序设计 1.  猜价格游戏 编写C++程序完成以下功能: (1) ...

  2. IOS开发中UI编写方式——code vs. xib vs.StoryBoard

    最近接触了几个刚入门的iOS学习者,他们之中存在一个普遍和困惑和疑问,就是应该如何制作UI界面.iOS应用是非常重视用户体验的,可以说绝大多数的应用成功与否与交互设计以及UI是否漂亮易用有着非常大的关 ...

  3. 【bzoj1497】 NOI2006—最大获利

    http://www.lydsy.com/JudgeOnline/problem.php?id=1497 (题目链接) 题意 给出一个图,每一个点有一个负点权,每一条边有一个边权.选择某一条边的前提是 ...

  4. UEditor上传图片到七牛云储存(java)

    我们的网站一般放在虚拟空间或者服务器上,图片如果存在本地目录,会占用很多空间和流量,还增加了负担,好的办法是把图片存放到云储存服务里面,平时用url去拿 云储存:普遍说又拍云和七牛比较好,看到七牛免费 ...

  5. hihocoder #1112 树上的好路径

    时间限制:1000ms单点时限:1000ms内存限制:256MB 描述 现在有一棵有N个带权顶点的树,顶点编号为1,2,...,N.我们定义一条路径的次小(最小)权为它经过的所有顶点(包括起点和终点) ...

  6. [JavaEE]调用Restful Service 出现415 Unsupported Media Type的问题(Rest Request Header中的Content-Type问题)

    用Chrome的插件Simple REST Client 调用POST的REST服务时,老是报415错误,如图. 一开始就以为是服务端的问题,各种google,百度,折腾了一下午未果. 晚上继续看,一 ...

  7. 【Alpha阶段】第三次Scrum例会

    会议信息 时间:2016.10.19 21:00 时长:0.5h 地点:大运村1号公寓5楼楼道 类型:日常Scrum会议 个人任务报告 姓名 今日已完成Issue 明日计划Issue 今日已做事务 工 ...

  8. Linux以外的开源操作系统大汇总

    开源操作系统即公开源代码的操作系统软件,它遵循开源协议使用.编译和发布.自由和开放源代码软件中最著名的是Linux,它是一种类Unix的操作系统.Linux可安装在各种计算机硬件设备中,比如手机.平板 ...

  9. Git更新到最新版本

    添加git的ppa源sudo apt-add-repository ppa:git-core/ppasudo apt-get updatesudo apt-get upgrade

  10. springMVC的注解@RequestParam与@PathVariable的区别

    1.在SpringMVC后台控制层获取参数的方式主要有两种, 一种是request.getParameter("name"),另外一种是用注解@RequestParam直接获取. ...