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) 线程私有 唯 ...
随机推荐
- rsync 简单使用 非默认ssh端口 分别从远程获取及推送本地的文件到远程
rsync: did not see server greetingrsync error: error starting client-server protocol (code 5) at mai ...
- Http服务端
第一,使用node提供的http模块 var http=require('http'); 第二,创建一个服务器实例 通过http的createServer()方法. var server=http.c ...
- orancle数据库 插入数量 值大于 1000 解决方案
存储过程:当基站ID大于1000的时候,把ID通过存储过程插入表,然后处理 不推荐这么弄,没办法,项目逼到这了,以后尽量避免这样的需求发生! CREATE OR REPLACE PROCEDURE i ...
- 机器人自主移动的秘密,从SLAM技术说起(一)
博客转载自:https://www.leiphone.com/news/201609/c35bn1M9kgVaCCef.html 雷锋网(公众号:雷锋网)按:本文作者SLAMTEC(思岚科技公号sla ...
- Posters TopCoder - 1684
传送门 分析 首先我们不难想到1e4^5的暴力枚举,但显然这是不行的,于是我们考虑对于每一张海报肯定有一种最优情况使得它至少有一条边要么靠着板子的边要么靠着之前的某一张海报的边,这样我们便可以将复杂度 ...
- Luogu 4137 Rmq Problem / mex
一个主席树题. 一开始想着直接动态开点硬搞就可以了,每次查询只要作一个类似于前缀和的东西看看区间有没有满,在主席树上二分就可以了. 但是这样是错的,因为一个权值会出现很多次……然后就错了. 所以我们考 ...
- 动态tab页
1.前台代码 <%-- builed by manage.aspx.cmt [ver:2015.25.26] at 2015-06-26 15:25:42 --%> <%@ Pag ...
- 实现斗地主纸牌游戏---洗牌 发牌 看底牌的具体功能------Map集合存储方法 遍历的应用
该Demo只是斗地主的游戏的一部分,实现的斗地主的组合牌 洗牌 发牌 看牌的功能,主要应用Map集合进行练习 package cn.lijun import java.util.ArrayList ...
- python使用基础(win10)
1.安装 官网下载:https://www.python.org/ 请选择2.X版本 2.从命令提示符打开python 直接输入python点enter即可 查看python版本输入python -V ...
- rpm bug
rpm无法安装 今天安装java时候,下载的rpm的包,但是用linux打开时候发现不能正常打开. 错误详情 主要是rpm安装时候的错误,java提示的错误就没有记录了. Reading packag ...