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) 线程私有 唯 ...
随机推荐
- JCTF 2014(Misc)
小试身手: 点击下载附件 res/raw/hehe,打开 得到flag
- Datapump tips
同时导出多个schema下的表 $ expdp system/manager dumpfile=test.dmp logfile=test.log directory=TESTDIR schemas= ...
- cfree使用cygwin编译程序出现计算机丢失cygwin1.dll解决办法
这种情况多是环境没配好,我的是64位cygwin C:\cygwin64\bin 加入到环境变量中,重打开cfree就可以解决.
- 【总结整理】IFeatureBuffer
IFeatureBuffer pRowBuffer = objTabWYDCQ_Tar.CreateFeatureBuffer(); pRowBuffer.Shape = SourceRow.Shap ...
- 分布式锁1 Java常用技术方案【转载】
前言: 由于在平时的工作中,线上服务器是分布式多台部署的,经常会面临解决分布式场景下数据一致性的问题,那么就要利用分布式锁来解决这些问题.所以自己结合实际工作中的一些经验和网上看到的一些资 ...
- BMP是可以保存alpha通道的。
一直以来都不太熟悉BMP格式,今天保存图片的时候发现bmp是可以保存透明通道的,突然想起来以前下载的一些游戏素材贴图里面就有一些bmp格式的贴图.记录一下.
- 51NOD1835 完全图
传送门 分析 令f(i,j)表示i点完全图有j个联通块的方案数. 讨论有i-1个点已经固定了,我们拉出一个代表元素然后讨论它的集合大小然后组合数算一下就可以了. $$ dp(i,j) = \sum_{ ...
- CSS相关知识和经验的碎片化记录
1.子DIV块中设置margin-top时影响父DIV块位置的问题 解决办法1:若子DIV块中使用margin-top,则在父DIV块中添加:overflow:hidden; 解决办法2:在子DIV块 ...
- matlab任务:FCM分类
一个朋友让帮忙做图像分类,用FCM聚类算法,网上查了一下,FCM基本都是对一幅图像进行像素的分类,跟他说的任务不太一样,所要做的是将一个文件夹里的一千多幅图像进行分类.图像大概是这个样子的(是25*2 ...
- Python中的切片操作
python中的切片操作功能十分强大,通常我们利用切片来进行提取信息,进行相关的操作,下面就是一些切片的列子. 列如我们从range函数1-100中取7的倍数,函数及结果如下所示: >>& ...