Java 内存区域与内存溢出异常
一、Java虚拟机内存划分
1.程序计数器
线程私有
可以看做是当前线程所执行的字节码的行号指示器。字节码解释器工作时是通过改变这个计数器的值来选取下一条需要执行的字节码指令。
Java虚拟机是通过多线程轮流切换并分配处理器执行时间的方式实现,为了切换线程后能正确的恢复到执行的位置,每一个线程都有一个独立的程序计数器。
2.Java虚拟机栈
线程私有,与线程的生命周期相同。
虚拟机栈描述的是Java方法执行的内存模型:每个方法创建的时候都要创建一个栈帧,用户存储局部变量表、操作数栈、动态链接、方法出口等信息。每个方法执行到结束标示一个栈帧的入栈到出栈。
局部变量表:存放编译期可知的基本数据类型(boolean ,byte,char,short,int,float,long,double),对象引用,returnAddress类型。long,double占用两个空间(slot),其他类型占用一个。
这个区域规定了两个异常:①线程请求的栈深度大于虚拟机允许的深度会抛出StackOverflowError,这种异常出现的场景最长现的是递归。简单说就是方法的层数太多。②虚拟机栈如果不能扩容,当方法太大的话,出现占用的内存太大出现OutOfMemoryError.
3.本地方法栈
与虚拟机栈发挥的作用相似,虚拟机栈为虚拟机执行Java方法服务,本地方法栈为虚拟机使用的Native方法服务。
4.Java堆
Java堆是所有线程共享的一块内存区域,在虚拟机启动的时候创建。所有对象实例以及数组都要在堆上分配。
如果堆中没有内存完成分配的时候,并且堆空间无法扩展的时候会出现OutOfMemoryError异常。
5.方法区
线程共享的内存区域,作用:存储已经被虚拟机加载的类信息、常量、静态变量、即时编译期编译后的代码等数据。
会出现OutOfMemoryError异常
6.运行时常量池
运行时常量池是方法区的一部分。Class文件中存在:类的版本、字段、方法、接口等描述信息;还有常量池:用户存放编译期生成的各种字面量和符号引用,这部分将在类加载之后进入方法区的运行时常量池。
二、HotSpot虚拟机对象探秘
1.对象的创建
1.1 虚拟机遇到new时,首先检查这个指令的参数是否在常量池中定位到一个类的引用,并且这个引用代表的类是否被加载、解析和初始化过,如果没有则执行相应的类加载过程。
1.2 虚拟机为对象分配内存
对象所需的大小在类加载之后就能确定。两种方案:①指针碰撞:需要内存是绝对规整的,分配了的在一边,未分配的在另一边。中间存放指针作为分界点的指示器。②空闲列表:记录哪些内存是可用的。分配方案根据垃圾回收机制确定,有没有压缩整理机制。
1.3 虚拟机将分配到的内存控件初始化为0.
1.4虚拟机对对象进行必要的设置。
例如:这个对象是哪个类的实例、如何才能找到类元数据信息、对象的哈希码、对象的GC分带年龄。这些信息存放在对象头之中。
1.5 上面工作完成后从虚拟机角度,对象已经创建,但是所有字段都是0,接着执行<init>操作把对象按照程序员的意愿进行初始化
2.对象的内存布局
对象在内存中布局可以分为3个区域:对象头、实例数据、对齐填充
2.1 对象头
包括两部分:①存储对象自身的运行数据,如哈希码、GC分带年龄、锁状态标识、线程持有的锁、偏向线程ID、偏向时间戳。
②类型指针:对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。
2.2 实例数据:对象真正存储的有效信息。
2.3对其部分:占位符。
3.对象的访问定位:
3.1句柄方式:
3.2 直接指针:
三、OutOfMemoryError异常
-Xss 128k (配置栈大小) -Xms -Xmx (配置堆大小,最大,最小)
Java 内存区域与内存溢出异常的更多相关文章
- 深入理解java虚拟机系列(一):java内存区域与内存溢出异常
文章主要是阅读<深入理解java虚拟机:JVM高级特性与最佳实践>第二章:Java内存区域与内存溢出异常 的一些笔记以及概括. 好了開始.假设有什么错误或者遗漏,欢迎指出. 一.概述 先上 ...
- 《深入理解java虚拟机》第二章 Java内存区域与内存溢出异常
第二章 Java内存区域与内存溢出异常 2.2 运行时数据区域
- 深入了解Java虚拟机(1)java内存区域与内存溢出异常
java内存区域与内存溢出异常 一.运行时数据区域 1.程序计数器:线程私有,用于存储当前所执行的指令位置 2.Java虚拟机栈:线程私有,描叙Java方法执行模型:执行方法时都会创建一个栈帧,存储局 ...
- 深入理解java虚拟机---->java内存区域与内存溢出异常
2. java内存区域于内存溢出异常 2.1 概述: 对于C/C++而言,内存管理具有最高的权利,既拥有每一个对象的“所有权”,又担负着每一个对象生命开始到结束的维护责任. 对于java而言,则把内存 ...
- 第二章Java内存区域与内存溢出异常
第二章 Java内存区域与内存溢出异常 一.概述 对与Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每个new操作去写delete/free代码,不容易出现内存泄露和内存溢出问 题, ...
- 2.1 自动内存管理机制--Java内存区域与内存溢出异常
自动内存管理机制 第二章.Java内存区域与内存溢出异常 [虚拟机中内存如何划分,以及哪部分区域.什么样代码和操作会导致内存溢出.各区域内存溢出的原因] 一.运行时数据区域 Java虚拟机所管理的内存 ...
- 虚拟机--第二章java内存区域与内存溢出异常--(抄书)
这是本人阅读周志明老师的<深入理解Java虚拟机>第二版抄写的,有很多省略,不适合直接阅读,需要阅读请出门左转淘宝,右转京东,支持周老师(侵权请联系删除) 第二章java内存区域与内存溢出 ...
- 深入理解Java虚拟机之Java内存区域与内存溢出异常
Java内存区域与内存溢出异常 运行时数据区域 程序计数器 用于记录从内存执行的下一条指令的地址,线程私有的一小块内存,也是唯一不会报出OOM异常的区域 Java虚拟机栈 Java虚拟机栈(Java ...
- 深入理解Java虚拟机之图解Java内存区域与内存溢出异常
Java内存区域与内存溢出异常 运行时数据区域 程序计数器 用于记录从内存执行的下一条指令的地址,线程私有的一小块内存,也是唯一不会报出OOM异常的区域 Java虚拟机栈 Java虚拟机栈(Java ...
- JVM内存区域与内存溢出异常
Java虚拟机在执行java程序时会把它所管理的内存会分为若干个不同的数据区域,不同的区域在内存不足时会抛出不同的异常. >>运行时数据区域的划分 (1)程序计数器程序计数器(Progra ...
随机推荐
- iOS中的过滤器和正则表达式(NSPredicate,NSRegularExpression)
参考链接:http://www.cocoachina.com/industry/20140321/8024.html NSPredicate Cocoa提供了一个NSPredicate类,它用来指定过 ...
- 刷题总结——飞扬的小鸟(NOIP2014提高组)
题目: 题目背景 NOIP2014 提高组 Day1 试题. 题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面 ...
- Win7开启SNMP服务
通过SNMP监控Windows主机需要在被监控的服务器上安装简单网络管理协议(SNMP)的Windows组件,以Windows 7系统为例: 首先,在控制面板中找到“卸载程序”: 在弹出的窗口中单击“ ...
- 【树状数组区间修改单点查询+分组】HDU 4267 A Simple Problem with Integers
http://acm.hdu.edu.cn/showproblem.php?pid=4267 [思路] 树状数组的区间修改:在区间[a, b]内更新+x就在a的位置+x. 然后在b+1的位置-x 树状 ...
- hdu 1104 数论+bfs
Remainder Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- ZOJ 3306 状压dp
转自:http://blog.csdn.net/a497406594/article/details/38442893 Kill the Monsters Time Limit: 7 Seconds ...
- 标准C程序设计七---23
Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ...
- PAT (Advanced Level) 1088. Rational Arithmetic (20)
简单题. 注意:读入的分数可能不是最简的.输出时也需要转换成最简. #include<cstdio> #include<cstring> #include<cmath&g ...
- Rmq Problem
大视野——3339: Rmq Problem Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1192 Solved: 620[Submit][Sta ...
- Centos7 下安装 RabbitMQ
安装 erlang 1.下载erlang 官网地址 http://www.erlang.org/download 挑选合适的版本 然后 wget 比如目前最新版本 19.3 运行命令 wget htt ...