Java虚拟机-----------Java内存区域与内存溢出异常
Java内存区域划分
Java虚拟机运行时的数据区大致可划分为五部分:方法区,堆(两部分组成Java堆内存),虚拟机栈,本地方法栈(Java栈内存),程序计数器。
1.程序计数器
程序计数器占较小的内存空间,可看作当前线程所执行的字节码的行号指示器。由于虚拟机的多线程通过线程轮流切换并分配处理器执行时间来实现的,所以在任何一个时候,一个处理器都只会执行一个线程中的指令。因此,对于每个线程,必须要通过程序计数器来对其进行标志,从而进行区分。各程序计数器之间是相互独立存储的。称程序计数器所占有的这部分内存为”线程私有“的内存。
2.Java虚拟机栈
Java虚拟机栈也是线程私有的。虚拟机栈描述的是Java方法执行的内存模型;每个方法在执行的同时都会创建一个栈帧用来存储局部变量表(放置了各种编译期已知的各种基本数据类型、对象引用类型和returnAddress类型)、操作数栈、动态链接等信息。每个方法从调用直到执行结束,可以看作栈帧在虚拟机栈中从进栈到出栈的过程。其中,64位长度的long和double类型的数据会占用2个局部变量空间。
Java虚拟机中,规范了两种异常情况,分别为:如果线程请求的栈深度大于虚拟机所允许的深度,则会发生StackOverflowError;如果虚拟机栈动态扩展内存时未能申请到足够的内存,则会发生OutOfMemoryError异常。
3.本地方法栈
虚拟机栈是为虚拟机执行Java方法服务,而本地方法栈则为虚拟机所使用的Native方法服务。本地方法栈的语言类型、使用方式和数据结构并未有强制规定。有的虚拟机甚至将本地方法栈和虚拟机栈进行合并(Sun公司的HotSpot虚拟机等)。除此之外,本地方法栈中同时会出现StackOverflow和OutOfMemory异常。
4.Java堆
Java堆是Java虚拟机所管理的内存中最大的一块,Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。它存在的唯一目的是存放对象实例。
Java堆是垃圾收集器回收的主要区域,因此有时也被程为”GC“堆。现有的回收器大多是采用分代收集方法的,因此Java堆可划分为:新生代和老年代。基本上分别占有的内存区域为1:2;其中Java堆可进一步细致划分为:Eden空间、From Survivor空间、To Survivor空间。比例为:8:1:1.
Java堆可以使内存连续的,也可以是不连续的,只要逻辑上连续即可。在实现上,可以是固定大小的,也可以是可扩展的。主流的虚拟机都是按照可扩展的设计的。当堆中没有内存进行对象实例化时,也会抛出OutOfMemory异常。(OCM异常是常见的异常。)
5.方法区
方法区也是被所有线程共享的一个内存区域。用于存储虚拟机加载类的类信息、常量、静态变量、即时编译器编译后的代码等数据。有个别名为NON-HEAP。目的是与Java堆进行区分。
人们更愿意将方法区成为永久代,两者本质上不等价。只不过HotSpot将GC分代扩展至方法区而已,或者说利用永久代实现方法区而已。
Java虚拟机-----------Java内存区域与内存溢出异常的更多相关文章
- 深入理解java虚拟机系列(一):java内存区域与内存溢出异常
文章主要是阅读<深入理解java虚拟机:JVM高级特性与最佳实践>第二章:Java内存区域与内存溢出异常 的一些笔记以及概括. 好了開始.假设有什么错误或者遗漏,欢迎指出. 一.概述 先上 ...
- 【深入Java虚拟机】之一:Java内存区域与内存溢出
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17565503 内存区域 Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若 ...
- 《深入理解Java虚拟机》-----第2章 Java内存区域与内存溢出异常
2.1 概述 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝又是执行最基础工作的劳动人民——拥有每一个对象的“所有权”,又担负着每一个对象生命开始到终结的维护责任 ...
- 【深入Java虚拟机(1)】:Java内存区域与内存溢出
原文出处: 兰亭风雨 内存区域 Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域.Java虚拟机规范将JVM所管理的内存分为以下几个运行时数据区:程序计数器.Jav ...
- 《深入理解java虚拟机》第二章 Java内存区域与内存溢出异常
第二章 Java内存区域与内存溢出异常 2.2 运行时数据区域
- 读书笔记,《深入理解java虚拟机》,第二章,java内存区域与内存溢出异常
第二节,运行时数据区域. 在这个章节中,作者给出了一个java虚拟机运行时数据区的框图,图的左侧是方法区和堆,这两个数据区是所有的线程所共享的.然后是虚拟机栈.本地方法栈.还有程序计数器,这三个 ...
- 深入了解Java虚拟机(1)java内存区域与内存溢出异常
java内存区域与内存溢出异常 一.运行时数据区域 1.程序计数器:线程私有,用于存储当前所执行的指令位置 2.Java虚拟机栈:线程私有,描叙Java方法执行模型:执行方法时都会创建一个栈帧,存储局 ...
- 《深入理解Java虚拟机》笔记--第二章、Java内存区域与内存溢出异常
Java程序员把内存的控制权交给了Java虚拟机.在Java虚拟机内存管理机制的帮助下,程序员不再需要为每一个new操作写对应的delete/free代码,而且不容易出现内存泄露和溢出. 虚拟机在执行 ...
- 深入理解java虚拟机---->java内存区域与内存溢出异常
2. java内存区域于内存溢出异常 2.1 概述: 对于C/C++而言,内存管理具有最高的权利,既拥有每一个对象的“所有权”,又担负着每一个对象生命开始到结束的维护责任. 对于java而言,则把内存 ...
- java虚拟机(一)-java内存区域与内存溢出异常
1.简述:java虚拟机在执行java程序的过程中,会把他所管理的内存分为以下几个区域, 1.1.程序计数器 1.2.虚拟机栈 1.3.本地方法栈 1.4.java堆 1.5.方法区 如图所示: 2. ...
随机推荐
- Day4-迭代器
for循环的数据类型: 1.集合数据类型,如list列表,tuple元组,dict字典,set集合,str字符串等: 2.generator生成器,包括生成器和带yield的generator fun ...
- Java调用IDL出错处理
之前有一个java调用idl的详细介绍http://www.cnblogs.com/lizhishan3380/p/4353286.html,里面有提到[需要先在java中加载IDL的java包(ja ...
- OpenGL: Rotation vector sensor of Android and Device motion of iOS
为了实现一个全景图片展示的功能,需要借助手机的姿态传感器,实现一个这样的功能:当手机旋转时,视角也跟着旋转(读者若理解不能,可以参考下现在流行的 VR 应用,使用陀螺仪模式时的效果,亦可称作" ...
- convertView的疑问(软件管理器)
package com.hixin.appexplorer; import java.util.List; import android.app.Activity; import android.co ...
- ES6核心内容精讲--快速实践ES6(三)
Promise 是什么 Promise是异步编程的一种解决方案.Promise对象表示了异步操作的最终状态(完成或失败)和返回的结果. 其实我们在jQuery的ajax中已经见识了部分Promise的 ...
- Cohort Analysis and LifeCycle Grids mixed segmentation with R(转)
This is the third post about LifeCycle Grids. You can find the first post about the sense of LifeCyc ...
- Web缓存相关知识整理
一.前言 工作上遇到一个这样的需求,一个H5页面在APP端,如果勾选已读状态,则下次打开该链接,会跳过此页面.用到了HTML5 的本地存储 API 中的 localStorage作为解决方案,回顾了 ...
- java模拟报文
为了以后节约时间,记录下模拟报文的实现 模拟报文思路:就是后台把接口数据先写在文档里面写死,接口地址不变,在每个接口里面控制是访问的模拟报文还是数据库里面的数据, 对于前端来说所有都是不变的,就是说我 ...
- QT调用百度语音REST API实现语音合成
QT调用百度语音REST API实现语音合成 1.首先点击点击链接http://yuyin.baidu.com/docs/tts 点击access_token,获取access_token,里面有详细 ...
- cocoapod升级
1.0 重新安装问题 cd /user/xx/.cocoapod/repos rm -rf master pod setup /user/xx/.cocoapod/repos 查看目录文件夹大小: d ...