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 ...
随机推荐
- 【Luogu】P3381最小费用最大流模板(SPFA找增广路)
题目链接 哈 学会最小费用最大流啦 思路是这样. 首先我们有一个贪心策略.如果我们每次找到单位费用和最短的一条增广路,那么显然我们可以把这条路添加到已有的流量里去——不管这条路的流量是多大,反正它能 ...
- [BZOJ1590] [Usaco2008 Dec]Secret Message 秘密信息(字典树)
传送门 看到前缀就要想到字典树! 看到前缀就要想到字典树! 看到前缀就要想到字典树! #include <cstdio> #include <iostream> #define ...
- day2之爬取拉勾网
认证流程 浏览器清空cookies 步骤一 访问拉勾网网站 https://www.lagou.com/ 做了些什么: 以get方式请求"https://www.lagou.com/&qu ...
- TYVJ3680 找妹子
时间: 1000ms / 空间: 1200KiB / Java类名: Main 背景 本题由 @fjzzq2002 提供,已奖励20金币. 描述 sps是zzq的好伙伴. sps一天叫来了许多个妹子. ...
- windows创建任务计划(周期执行bat脚本)
https://jingyan.baidu.com/article/ca00d56c767cfae99febcf73.html windows找到任务计划程序: 这台电脑->管理
- AnyChart创建实时仪表
AnyChart创建实时仪表 简述: AnyChart是一款基于Flash和HTML5的图表.仪表控件,所包含的图表类型众多和跨平台以及跨浏览器是该产品的主要特点和优点,另外该产品基于XML文件作为数 ...
- ZOJ - 3816 Generalized Palindromic Number dfs
Generalized Palindromic Number Time Limit: 2 Seconds Memory Limi ...
- 在dedecms系统下, 改写火车头的入库接口 写一个接口文件运行一次自动读取 http://news.163.com/rank/
1:火车头入库接口里面的密码与login.php传过来的密码是保持一致的: 2:在(!$ispost)里面编写一个form表单提交,验证用户名,channelid,以及typeid; html代码格式 ...
- linux下将目录授权给其他用户的步骤
1.更改目录所有者命令:chown -R 用户名称 目录名称2.更改目录权限命令:chmod -R 755 目录名称
- 搭建Redis环境以及所遇问题(CentOS7+Redis 3.2.8)
一.安装步骤 1. 首先需要安装gcc,把下载好的redis-3.2.8-rc2.tar.gz 放到/usr/local文件夹下 2. 进行解压 tar -zxvf redis-3.2.8-rc2.t ...