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

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内存区域与内存溢出异常---运行时数据区域的更多相关文章
- Java内存区域与内存溢出异常--运行时数据区
Java与C之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”. C.C++程序开发在内存管理区域,既拥有每一个对象的“所有权”,又担负着每一个对象声明开始到终结的责任,而Java在虚拟机自动管理 ...
- 《深入理解java虚拟机》笔记(1)运行时数据区域
1.Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来. 2.运行时数据区域划分 java虚拟机在执行java程序的过程中会把它所管理的内存划 ...
- 深入理解java虚拟机阅读笔记(1)运行时数据区域
java虚拟机所管理的内存区域主要分为方法区.堆:虚拟机栈.本地方法栈.程序计数器,如图: 1.程序计数器是当前线程所执行的字节码行号指示器,用以记录当前指令执行的位置.程序计数器是线程私有的,每个线 ...
- Java虚拟机 - 结构原理与运行时数据区域
http://liuwangshu.cn/java/jvm/1-runtime-data-area.html 前言 本来计划要写Android内存优化的,觉得有必要在此之前介绍一下Java虚拟机的相关 ...
- [jvm]运行时数据区域详解
了解虚拟机是怎么使用内存的,有助于我们解决和排查内存泄漏和溢出方面的问题.详解java虚拟机内存的各个区域,分析这些区域的作用服务对象以及可能发生的问题. 一.运行时数据区域 java虚拟机在执行ja ...
- JVM 运行时数据区域划分
目录 前言 什么是JVM JRE/JDK/JVM是什么关系 JVM执行程序的过程 JVM的生命周期 JVM垃圾回收 JVM的内存区域划分 一.运行时数据区包括哪几部分? 二.运行时数据区的每部分到底存 ...
- Java内存区域(运行时数据区域)和内存模型(JMM)
Java 内存区域和内存模型是不一样的东西,内存区域是指 Jvm 运行时将数据分区域存储,强调对内存空间的划分. 而内存模型(Java Memory Model,简称 JMM )是定义了线程和主内存之 ...
- Java内存区域(运行时数据区域)详解、JDK1.8与JDK1.7的区别
2.1 概述 对Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每个对象的new操作去写配对的delete/free 代码,不容易出现内存泄露和内存溢出的问题.不过,仍然需要Java虚 ...
- Java虚拟机所管理的内存,包含的运行时数据区域?
运行时数据区域 线程私有(随用户线程的启动和结束而建立和销毁)或所有线程共享(随虚拟机进程的启动而存在) 抛出的异常 备注 程序计数器(Program Counter Register) 线程私有 唯 ...
随机推荐
- Celery-4.1 用户指南: Workers Guide (Workers 指南)
启动工作单元 你可以通过执行以下命令在前台启动工作单元: $ celery -A proj worker -l info 查看启动工作单元的可用命令行选项,可以执行: $ celery worker ...
- CentOS7 线上环境的一些 配置
上周服务器被攻击导致上面收回了我们服务器的IP,所以这周重新安装部署了服务器,使用centos7系统.为了防止服务器再次被攻击,所以建议以下几点: 1. root密码要复杂一点,尽量字母数字特殊字符都 ...
- Centos 7.2 安装稳定版 nginx
1. 创建适用于RHEL/CentOS系统的安装源文件,位置为: /etc/yum.repos.d/nginx.repo , 并写入以下内容: [nginx] name=nginx repo base ...
- 11-15SQLserver基础--数据库之范式理论
数据库的设计理论与思路 在设计数据库的时候,有一个著名的设计理论---范式理论. 1.内容: 第一范式:每一列的数据类型要单一,必须要统一: 第二范式:在设计主键的时候,主键尽量更能体现表中的数据信息 ...
- leetcode653
class Solution { public: bool findTarget(TreeNode* root, int k) { queue<TreeNode> Q; vector< ...
- CALayer的基本使用
CALayer需要导入这个框架:#import <QuartzCore/QuartzCore.h> 一.CALayer常用属性 属性 说明 是否支持隐式动画 anchorPoint 和中心 ...
- LNMP 1.2 Nginx编译安装
Nginx官网是:nginx.org 下载稳定版本 cd /usr/local/src wget http://nginx.org/download/nginx-1.8.0.tar.gz tar zx ...
- gridcontrol 添加行号
private void gridView1_CustomDrawRowIndicator(object sender, DevExpress.XtraGrid.Views.Grid.RowIndic ...
- FFmpeg for Android compiled with x264, libass, fontconfig, freetype and fribidi
android下打算使用ffmpeg的 drawtext ,不过需要 --enable-libfreetype 但是freetype是个第三方库,所以需要先编译freetype,然后再编译ffmpe ...
- springboot整合mybatis+generator
源码地址:springboot-integration 如果你觉得解决了你使用的需求,欢迎fork|star.