运行时数据区域

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. Celery-4.1 用户指南: Canvas: Designing Work-flows(设计工作流程)

    签名 2.0 版本新特性. 刚刚在calling 这一节中学习了使用 delay 方法调用任务,并且通常这就是你所需要的,但是有时候你可能想将一个任务调用的签名传递给另外一个进程或者作为另外一个函数的 ...

  2. Java之——java.lang.NoSuchMethodException: [org.springframework.web.multipart.MultipartFile;.()

    转自:https://blog.csdn.net/l1028386804/article/details/65449355 ava.lang.NoSuchMethodException: [org.s ...

  3. CALayer的基本使用

    CALayer需要导入这个框架:#import <QuartzCore/QuartzCore.h> 一.CALayer常用属性 属性 说明 是否支持隐式动画 anchorPoint 和中心 ...

  4. 部署和调优 2.9 mysql主从配置-3

    测试 先给主mysql解锁 > unlock tables; 删除一个表 > use db1; > show tables; > drop table help_categor ...

  5. DAY19-Django之form组件补充

    问题1:注册页面输入为空,报错:keyError:找不到password def clean(self): print("---" ,self.cleaned_data) # if ...

  6. Vue基础汇总

    1)双向绑定: <div id="app"> <p>{{message}}</p> <input v-model="messag ...

  7. 数据从HDFS-->HIVE-->HBASE 执行过程

    1.数据已经load进去hdfs 2.hive.hbase已经安装成功(我用的是hadoop 2.4 hbase 0.98.12 hive 1.2.1) 3.开始! 4.在hive建立表同时生成对应的 ...

  8. equals()与hashCode()方法详解

    java.lang.Object类中有两个非常重要的方法: 1 2 public boolean equals(Object obj) public int hashCode() Object类是类继 ...

  9. js刷新当前页面的几种方法

    如何实现刷新当前页面呢?借助js你将无所不能. 1,reload 方法,该方法强迫浏览器刷新当前页面.语法:location.reload([bForceGet])   参数: bForceGet, ...

  10. jetty启动常用命令

    1. 启动Jetty Server:运行命令:Java -jar start.jar    指定项目名称启动:   java -jar start.jar -Dname=zoush 保持jetty后台 ...