运行时数据区域

Java虚拟机所管理的内存将会包括以下几个运行时数据区域

线程私有区域

1.程序计数器

  程序计数器记录的是当前正在执行的虚拟机字节码指令所在的地址。在虚拟机的概念模型中,字节码解释器就是通过改变这个计数器来获取下一条需要执行的字节码指令。分支,循环,跳转,异常处理,线程回复都需要依赖该计数器完成。

  每条线程都有一个独立的程序计数器,各程序计数器之间互不影响,独立存储,我们称这类内存区域为线程私有的内存。此内存区域是虚拟机中唯一没有规定任何OutOfMemoryError的区域。

2.Java虚拟机栈

  Java虚拟机栈也是线程私有的。虚拟机栈描述的是Java方法的内存模型,每个方法在执行的同时都会创建一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法出口等信息。

  每一个方法从运行到结束,就是对应着一个栈帧的出栈和入栈。局部变量表存放了编译期可知的各种基本数据类型(boolean,byte,char,short,int,float,double,)和对象引用。

  在Java虚拟机规范中对这个区域规定了两种异常状况:如果线程请求的栈深度大于虚拟机所允许的深度,就会发生StackOverflowError异常,如果虚拟机栈在扩展的过程中无法申请到足够的内存,就会抛出OutOfMemoryError异常

3.本地方法栈

  本地方法栈和虚拟机栈的作用类似,只不过虚拟机栈为虚拟机执行java方法(也就是字节码服务),而本地方法栈为虚拟机执行本地方法。同样该区域也有StackOverflowError异常和OutOfMemoryError异常。

线程共享区域

1.Java堆

  Java堆是java虚拟机所管理的内存中最大的一块。Java堆是被所有线程所共享的一块区域。此区域的唯一目的就是,存放对象实例。

  Java堆是垃圾收集的主要区域,很多时候也被称为GC堆。由于现在的垃圾收集器都基本采用分代收集算法,所以Java堆还可以细分为新生代老生代

  Java虚拟机规范规定,Java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可。Java堆得大小可以是固定的也可以进行扩展(通过 -Xmx和-Xms控制)。在堆无法扩展时,会抛出OutOfMemoryError异常。

2.方法区

  方法区与Java堆一样,是各个线程共享的存储区域,它用于存储已被虚拟机加载的类信息常量静态变量即时编译器编译后的代码等数据。垃圾收集行为在这个区域很少出现。这区域的内存回收目标主要集中在对常量池的回收和对类型的卸载

3.运行时常量池

  运行时常量池存在于方法区,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。

  运行时常量池时方法区的一部分,所以,当常量池无法申请到内存时就会抛出OutOfMemoryError异常。

直接内存

  不属于虚拟机运行时数据区域的一部分。也不是虚拟机定义的内存区域。在 JDK 1.4 中新引入了 NIO 类,它可以使用 Native 函数库直接分配堆外内存,然后通过 Java 堆里的 DirectByteBuffer 对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在堆内存和堆外内存来回拷贝数据。同样存在OutOfMemoryError异常。

Java内存区域与内存溢出异常---运行时数据区域的更多相关文章

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

    Java与C之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”. C.C++程序开发在内存管理区域,既拥有每一个对象的“所有权”,又担负着每一个对象声明开始到终结的责任,而Java在虚拟机自动管理 ...

  2. 《深入理解java虚拟机》笔记(1)运行时数据区域

    1.Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来. 2.运行时数据区域划分 java虚拟机在执行java程序的过程中会把它所管理的内存划 ...

  3. 深入理解java虚拟机阅读笔记(1)运行时数据区域

    java虚拟机所管理的内存区域主要分为方法区.堆:虚拟机栈.本地方法栈.程序计数器,如图: 1.程序计数器是当前线程所执行的字节码行号指示器,用以记录当前指令执行的位置.程序计数器是线程私有的,每个线 ...

  4. Java虚拟机 - 结构原理与运行时数据区域

    http://liuwangshu.cn/java/jvm/1-runtime-data-area.html 前言 本来计划要写Android内存优化的,觉得有必要在此之前介绍一下Java虚拟机的相关 ...

  5. [jvm]运行时数据区域详解

    了解虚拟机是怎么使用内存的,有助于我们解决和排查内存泄漏和溢出方面的问题.详解java虚拟机内存的各个区域,分析这些区域的作用服务对象以及可能发生的问题. 一.运行时数据区域 java虚拟机在执行ja ...

  6. JVM 运行时数据区域划分

    目录 前言 什么是JVM JRE/JDK/JVM是什么关系 JVM执行程序的过程 JVM的生命周期 JVM垃圾回收 JVM的内存区域划分 一.运行时数据区包括哪几部分? 二.运行时数据区的每部分到底存 ...

  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. Even uploading a JPG file can lead to Cross-Site Content Hijacking (client-side attack)!

    Introduction: This post is going to introduce a new technique that has not been covered previously i ...

  2. 利用Synergy在局域网内让Ubuntu和Windows 7两台机器共用一套键鼠。

    一个主机可以连接多个显示器, 方便自己使用, 但是这只是一个系统分屏显示, 如果想用两台不同系统的电脑, 并且还不想老是在两套键鼠之间来回转换, 那么建议你可以用Synergy软件来实现多台电脑之间的 ...

  3. delphi 面向对象实用技能教学二(封装)

    面向对象编程手法,是一项综合技能,单独把谁拿出来说都不合适.本次重写 TSimpleThread ,使其能在 D7 下运行. 基于 TSimpleThread ,重磅推出 TSimpleUI.ExeP ...

  4. SqlServer——判断对象是否存在

    对以下对象判断是否存在:database.table.proc.触发器.临时表.索引.对于这些对象的判断是通过数据表 SysObjects来获得的. 一.基础知识 1.SysObjects系统表 对于 ...

  5. leetcode443

    使用两个数组分别记录字符和对应的数字,然后清除原来的vector,重新向里面添加元素.注意判断1个字符时,不将'1'加入vector. int compress(vector<char>& ...

  6. Spring MVC F5刷新问题

    转自:https://bbs.csdn.net/topics/390771056 post操作成功后重定向到B,这样浏览器里F5的时候就不会让提交A了    

  7. dp-矩阵连乘

    参考:http://blog.csdn.net/liufeng_king/article/details/8497607 使用备忘录算法复杂度降至O(n^3) #include<stdio.h& ...

  8. oracle create user &tablespace & imp

    一.表空间 1.创建表空间 CREATE TABLESPACE 空间名称 DATAFILE '文件名1' SIZE 数字M [,'文件名2' SIZE 数字….] EXTENT MANAGEMENT ...

  9. Android按钮单击事件的四种常用写法

    这篇文章主要介绍了Android按钮单击事件的四种常用写法总结,比较了常见的四种写法的优劣,有不错的参考借鉴价值,需要的朋友可以参考下 很多学习Android程序设计的人都会发现每个人对代码的写法都有 ...

  10. 标签控件JLabel的使用

    ---------------siwuxie095                             工程名:TestUI 包名:com.siwuxie095.ui 类名:TestLabel.j ...