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 ...
随机推荐
- POJ 3581 Sequence ——后缀数组 最小表示法
[题目分析] 一见到题目,就有了一个显而易见obviously的想法.只需要每次找到倒过来最小的那一个字符串翻转就可以了. 然而事情并不是这样的,比如说505023这样一个字符串,如果翻转了成为320 ...
- 【二叉搜索树】hdu 3791
http://acm.hdu.edu.cn/showproblem.php?pid=3791 [注意] 是看树的形态是否一样,而不是中序遍历的结果 [Accepted] #include<ios ...
- 远程管理 KVM 虚机
上一节我们通过 virt-manager 在本地主机上创建并管理 KVM 虚机.其实 virt-manager 也可以管理其他宿主机上的虚机.只需要简单的将宿主机添加进来 填入宿主机的相关信息,确定即 ...
- Codevs 1299 切水果 水一发
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 简单的说,一共N个水果排成一排,切M次,每次切[L,R]区间的所有水果(可能有的 ...
- R语言入门视频笔记--5--自定义函数
自定义函数 你可以输出一段代码,创建一个你自己定义的函数 蛋是如果你两个自定义函数的名字重复的话,后面的会把前面的替换掉 举个栗子: hanshu1 <- function(x) sqrt(v ...
- Laravel 报500错误
Laravel报500错误 发生情境: 使用Composer安装Laravel5.1版本到本地wamp环境,可以成功访问框架首页,然后上传到服务器上,报500错误. 解决: (1)在首页public/ ...
- MySQL的LOOP, LEAVE 和ITERATE语句(类似Continue、Break的写法)
和REPEAT和while语句不同,LOOP.LEAVE.ITERATE更像其他编程语言中的goto语句. LOOP要设定一个label指定循环的开始位置,而LEAVE则像其他语言中的Break会离开 ...
- Codeforces 375 D Tree and Queries
Discription You have a rooted tree consisting of n vertices. Each vertex of the tree has some color. ...
- VMware 虚拟机下载链接
VMware 14 链接: https://pan.baidu.com/s/1mBeyX2Z6hGpbFc8_UC-sEw 提取码: 462t 密钥:AA510-2DF1Q-H882Q-XFPQE-Q ...
- java多线程02-----------------synchronized底层实现及JVM对synchronized的优化
java多线程02-----------------synchronized底层实现及JVM对synchronized的优化 提到java多线程,我们首先想到的就是synchronized关键字,它在 ...