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 ...
随机推荐
- NOJ——1642简单的图论问题?(BFS+优先队列)
[1642] 简单的图论问题? 时间限制: 5000 ms 内存限制: 65535 K 问题描述 给一个 n 行 m 列的迷宫,每个格子要么是障碍物要么是空地.每个空地里都有一个权值.你的 任务是从找 ...
- mybatis学习(二)——环境搭建
开发环境搭建主要包括以下几步 1.新建一个JAVA项目(可以只建一个文件夹) 2.导入jar包 log4j是一个日志包,可以不加,这里为了定位问题添加了该包,下面两个包必须需要. 3.创建数据库 C ...
- 多线程-java并发编程实战笔记
线程安全性 编写线程安全的代码实质上就是管理对状态的访问,而且通常都是共享的,可变的状态. 一个对象的状态就是他的数据,存储在状态变量中,比如实例域或静态域.所谓共享是指一个对象可以被多个线程访问:所 ...
- Linux(10):期中架构(2)--- NFS存储服务 & 实时同步
1. 共享存储服务概念: # NFS是Network File System的缩写,中文意思是网络文件系统, # 它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录. 2. ...
- Yii 之控制器响应
public function actionIndex(){ //控制器响应处理 $res = \Yii::$app->response; //设置状态码 // $res->statusC ...
- java连oracle
下载连接驱动 安装完oracle之后 D:\app\Administrator\product\11.2.0\dbhome_1\jdbc\lib 目录下拷贝 支持jdk1.6以上 From.java ...
- Linux下Shell脚本运行程序不输出日志到终端
使用: 脚本路径/脚本名 >/dev/>& 说明: 可以简单的理解/dev/null是Linux下的回收站 >默认是把标准输出重定向 2>&1是把出错输出也定向 ...
- 【Java TCP/IP Socket】TCP Socket(含代码)
TCP的Java支持 协议相当于相互通信的程序间达成的一种约定,它规定了分组报文的结构.交换方式.包含的意义以及怎样对报文所包含的信息进行解析,TCP/IP协议族有IP协议.TCP协议和UDP协议.现 ...
- tcp-time-wait-state
https://vincent.bernat.im/en/blog/2014-tcp-time-wait-state-linux
- 【c++】面向对象程序设计之虚函数详解
一.动态绑定什么时候发生 当且仅当通过指针或引用调用虚函数时,才会在运行时解析该调用 二.派生类中的虚函数 当我们在派生类中覆盖了某个虚函数时,可以再一次使用virtual指出该函数的性质,但是这么做 ...