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. ...
随机推荐
- cocoapods卸载重装 解决clone,install,search很慢的问题
电脑上面的cocoapods clone,pod install search的时候非常非常的慢,尝试了很多方法都无法解决,最后只能尝试着重装看看能不能解决问题 卸载 sudo gem uninsta ...
- Java 多线程详解(四)------生产者和消费者
Java 多线程详解(一)------概念的引入:http://www.cnblogs.com/ysocean/p/6882988.html Java 多线程详解(二)------如何创建进程和线程: ...
- 【试验局】ReentrantLock中非公平锁与公平锁的性能测试
硬件环境: CPU:AMD Phenom(tm) II X4 955 Processor Memory:8G SSD(128G):/ HDD(1T):/home/ 软件环境: OS:Ubuntu14. ...
- c语言项目开发流程二部曲
一.在第一部曲中我们介绍了电子词典项目开发的前5步,下面继续我们的步伐. 6.函数接口设计,这一步不是一蹴而就的,在项目进行中得不断修改,下面是我电子词典项目接口. /**************函数 ...
- Linux网络服务01——Linux网络基础设置
Linux网络服务01--Linux网络基础设置 一.查看及测试网络 1.使用ifconfig命令查看网络接口 (1)查看活动的网络接口 ifconfig命令 [root@crushlinux ~]# ...
- python中defaultdict的用法
初识defaultdict 之前在使用字典的时候, 用的比较随意, 只是简单的使用dict. 然而这样在使用不存在的key的时候发生KeyError这样的一个报错, 这时候就该defaultdict登 ...
- 数据库数据对比自动生成sql
1.故事背景 有一次迭代步入尾声,提交给用户测试,系统管理员在测试环境中初始了一些数据,然后在上线的时候系统管理员再去正式环境初始这一些数据,然而这次数据太多了,说了一次:”为什么要初始化两次?“ 你 ...
- 关于log4.net 错误,求解
1.上结果 能生成文件 ,但是文件中无内容 2.配置文件 <configSections> <section name="log4net" type=" ...
- OSS web直传 ajax方式 上传图片、文件
部分js代码 send_request = function(){//这是从后台获取认证策略等信息. var htmlobj=$.ajax({url:root+"/service/polic ...
- ecshop的详细安装步骤
从网上找个ecshop包,然后下载,解压,解压后的ecshop是不能直接用的,要更改几个目录的权限才能用. ecshop要放在www目录下,这样访问的话就可以直接 http://localhost/e ...