JVM内存区域与内存溢出的异常

java虚拟机运行时数据区
线程独享区域 线程共享区域
虚拟机栈 方法区
本地方法栈
程序计数器
区域 存储内容
对象和数组
程序计数器 虚拟机字节码指令的地址或者是Undefined
本地方法栈 Native方法
虚拟机栈 局部变量表操作数栈动态链接方法出口
方法区 类信息常量静态变量

JVM内存区域

程序计数器

内存空间小,线程私有。字节码解释器的工作就是通过改变这个计数器的值来选取下一条需要执行指令的字节码指令,循环、异常处理、线程恢复等基础功能都需要依赖计数器来完成。

java虚拟机栈

线程私有,生命周期和线程一致。描述的是java方法执行的内存模型:每个方法在执行时都会创建一个栈桢用于存储局部变量表、操作数栈、方法出口等信息。每一个方法从调用直到执行结束,就对应这一个栈桢从从虚拟机栈中入栈到出栈的过程

局部变量表:存放了编译期可知的各种基本类型(八种基本的数据类型)、对象引用类型和返回地址类型(指向了一条字节码指令的地址)

  • stackOverFlowError:线程请求的栈深度大于虚拟机所允许的深度。
  • outOfMemoryError:如果虚拟机栈可以动态扩展,而扩展是无法申请到足够的内存。

本地方法栈

java虚拟机栈是执行java方法的,而本地方法栈则是虚拟机使用到的Native方法服务的。也会有stackOverFlowError、outOfMemoryError异常。

栈是什么?

栈也叫做栈内存,主管java程序的运行,是在线程创建是创建的,它的生命周期是和线程一样的,线程结束栈内存也就是释放了。对于栈来说不存在垃圾回收的问题。

栈帧中主要保存什么?

  • 本地变量: 输入参数和输出参数以及方法内的变量
  • 栈操作:记录出栈入栈的操作
  • 栈帧数据: 包括类文件方法

栈的运行原理

栈中的数据都是以栈帧的格式存在的,栈帧是一个内存块是一个数据集,是一个有关方法和运行期数据的数据集
遵循 FILO原则

示意图

顶部栈就是当前方法,该方法执行完毕会自动将此栈帧出栈

栈顶就是当前方法

栈结构示意图

java堆

对于绝大多数应用来说,这块区域是JVM所管理的最大的一块,线程共享,主要是用来存放 对象和数组。内部会划分出多个线程私有的分配缓冲区。可以位于物理上不连续的空间,但是逻辑上要连续。

堆是什么?(1.7及之前)

结构图

一个JVM实例只存在一个堆内存堆内存的大小是可以调节的类加载器读取了类文件后,需要把类、方法、常变量****放到堆内存中,保存所有引用类型的真实信息,以方便执行器执行,堆内存分为了三个部分。
* 新生区
* 养老区
* 永久区

新生区

示意图

新生区是类的诞生、成长、消亡的区域,一个类在这里产生,应用,最后被垃圾回收器回收,结束生命。新生区又分为两个部分,伊甸区和幸存者区,幸存者区又分为幸存一区和幸存二区。

  1. 当伊甸区的空间用完时,程序又需要创建对象,jvm的垃圾回收器将会对伊甸区进行垃圾回收,然后将伊甸区的剩余对象移动到幸存0区
  2. 如果将幸存0区也满了,再对该区域进行垃圾回收,然后移动到1区
  3. 如果1区也满了,再次进行垃圾回收,满足条件后再移动到养老区
  4. 养老区也满了会产生FullGC,会产生OOM异常。

如果出现java.lang.OutOfMemoryError: Java heap space异常,说明
Java虚拟机的堆内存不够。原因有二::

  1. java虚拟机的内存设置的太小,通过-Xms -Xmx来调整
  2. 代码中创建了大量的大对象,并且长时间不能被垃圾回收器收集。

养老区

存放新生代中经历多次GC仍然存活的对象

永久区

永久区是一个常驻内存区域,用于存放JDK自身所携带的Class,Integerface的元数据,也就是说他存储的是运行环境必须的类信息,被装载进此区域的数据是不会被垃圾回收的,关闭JVM才会释放此区域的所占用的内存

jdk1.7: 有永久代,但已经逐步“去永久代”,常量池1.7在堆
jdk1.8以后,去掉了永久区,常量池1.8在元空间

永久代和方法区的区别?

方法区和堆一样,是各个线程共享的内存区域,不同的是,可以说永久代实现了方法区,(相当于是一个接口的实现),方法区存储的是一些字节码文件,而堆存储的是对象。

常量池和方法区的关系

常量池是方法区的一个部分,Class文件除了有类的版本、字段、方法、接口等描述信息外,还有一项信息就是常量池在类加载后进入方法区的运行时常量池中存放。

方法区

属于共享内存区域,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

运行时常量池

属于方法区的一个部分,用于存放编译器生成的各种字面量和符号引用。编译器和运行期都可以将常量放入池中。

内存有限,无法申请是抛出OutOfMemoryError。

直接内存

在 JDK 1.4 中新加入 NIO类,引入了一种基于通道(Channel)和缓存(Buffer)的 I/O 方式,它可以使用 Native 函数库直接分配堆外内存,然后通过一个存储在 Java 堆中的 DirectByteBuffer 对象作为这块内存的引用进行操作。可以避免在 Java 堆和 Native 堆中来回的数据耗时操作。

OutOfMemoryError:会受到本机内存限制,如果内存区域总和大于物理内存限制从而导致动态扩展时出现该异常。

JVM堆参数调优

-Xms 设置初始分配大小,默认为物理内存的1/64
-Xmx 最大分配内存,默认为物理内存的1/4

VM参数: -Xms1024m -Xmx1024m -XX:+PrintGCDetails

使用MAT工具

  • 分析dump文件,快速定位内存泄漏;
  • 获得堆中对象的统计数据
  • 获得对象相互引用的关系
  • 采用树形展现对象间相互引用的情况
  • 支持使用OQL语言来查询对象信息

-XX:+HeapDumpOnOutOfMemoryError
OOM时导出堆到文件。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容