`
wangqisen
  • 浏览: 46978 次
文章分类
社区版块
存档分类
最新评论

Java内存区域与内存溢出异常

 
阅读更多

一、运行时数据区域

线程隔离的数据区:虚拟机栈、本地方法栈、程序计数器。

所有线程共享的数据区:方法区、堆。

二、

2.1程序计数器

程序计数器是一块较小的内存空间,用来指示当前线程执行的字节码的行号,完成分支,循环,跳转的功能。

为什么会需要程序计数器作为线程隔离的内存区域而不是所有线程共用?因为Java虚拟机的多线程是通过切换时间片的方式来实现的,因此,在一个确定的时刻,一个处理器只会执行一条线程。因此,为了线程切换之后仍能够回到正确的字节码行号,必需每个线程有一个独立的程序计数器。

2.2Java虚拟机栈

Java虚拟机栈是线程私有的,它的生命周期与线程相。虚拟机栈描述的是Java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧来存储局部变量表,操作数栈,动态链接,方法出口等信息。每一个方法从调用直到完成的过程,就对应于一个栈帧在虚拟机栈中入栈到出栈的过程。

与内存分配最密切的就是虚拟机栈中的局部变量表和堆这两部分。局部变量表存放了编译期可知的各种基本数据类型、对象引用和returnAddress类型,returnAddress类型指向了一条指令字节码的地址。

其中,64为长度的long和double类型的数据会占用2个局部变量空间,其余的数据类型只占用一个。局部变量表所需要的空间在编译期间完成分配。

如果线程所请求的栈深度超过了java虚拟机栈所允许的深度。将抛出StackOverflowError异常。如果虚拟机栈可以动态扩展,但是扩展时无法申请到足够的内存,就会抛出OutOfMemorryError异常。

2.3本地方法栈

与虚拟机栈十分相似,只是虚拟机栈为虚拟机执行java方法,而本地方发展则为虚拟机所使用到的Native方法服务。与虚拟机栈一样,本地方法栈区域也会抛出StackOverFlowError和OutOfMemorryError异常。

2.4Java堆

Java堆是被所有线程共享的内存区域,在虚拟机启动时创建。几乎所有的对象实例都在这里分配。Java堆是垃圾收集器管理的主要区域。Java的大小可以通过-Xmx和-Xms控制。如果堆无法再扩展时,将会抛出OutOfMemorryError异常。

2.5方法区

方法区用于存储已被虚拟机加载的类信息,常量,静态变量等数据。这区域的内存回收目标主要在于对常量池的回收和对类型的卸载。

其中,运行时常量池是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译器生成的各种字面量和符号引用。

2.6直接内存

NIO通过基于通道与缓冲区的I/O方式,可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存进行操作。这样能显著提高性能,因为避免了在Java堆和Native堆中来回复制数据。

栈上的reference数据被用来操作堆上的具体对象,可以通过这个reference引用来定位、访问堆中的对象的具体位置。目前的主流访问方式有两种:使用句柄和直接指针。

Java堆的最小值设置参数-Xms,最大值设置参数-Xmx。两种设置为一样可以避免堆自动扩展。

Java堆内存的OOM异常是实际应用中常见的内存溢出异常情况。出现OOM时,应该分清是内存泄露还是内存溢出。‘


分享到:
评论

相关推荐

    JAVA内存区域与内存溢出异常归类.pdf

    JAVA内存区域与内存溢出异常归类.pdf

    深入理解Java虚拟机——Java内存区域与内存溢出异常.xmind

    这是自己读《深入理解Java虚拟机》时候用XMind建立的思维导图,目的是为了能够帮助自己整理、梳理相关的知识以及方便自己日后的回顾,帮助自己建立起关于JVM的知识体系,里边也有一些对相关内容的补充,通过备注的...

    Java内存区域与内存溢出异常详解

    主要介绍了Java内存区域与内存溢出异常详解的相关资料,需要的朋友可以参考下

    lanlan2017#JavaReadingNotes#2.4.4 本机直接内存溢出1

    - 第2章 Java内存区域与内存溢出异常- 2.4 实战:OutOfMemoryError异常2.4.4 本机直接内存溢出直接内存(Direct Memory

    深入理解_Java_虚拟机 JVM_高级特性与最佳实践

    第2章 Java内存区域与内存溢出异常 / 24 2.1 概述 / 24 2.2 运行时数据区域 / 25 2.2.1 程序计数器 / 25 2.2.2 Java虚拟机栈 / 26 2.2.3 本地方法栈 / 27 2.2.4 Java堆 / 27 2.2.5 方法区 / 28 2.2.6 运行...

    Java虚拟机

    第2章 Java内存区域与内存溢出异常 2.1 概述 2.2 运行时数据区域 2.2.1 程序计数器 2.2.2 Java虚拟机栈 2.2.3 本地方法栈 2.2.4 Java堆 2.2.5 方法区 2.2.6 运行时常量池 2.2.7 直接内存 2.3 HotSpot...

    学习JVM之java内存区域与异常

    关于JVM内存区域的知识对于初学者来说其实是很重要的,了解Java内存分配的原理,这对于以后JAVA的学习会有更深刻的理解。下面来看看详细介绍。

    Tomcat内存溢出的三种情况及解决办法分析

    Tomcat内存溢出的三种情况及解决办法分析 Tomcat内存溢出的原因 在生产环境中tomcat内存设置不好很容易出现内存溢出。造成内存原因是不一样的,当然处理方式也不一样。 这里根据平时遇到的情况和相关资料进行一个...

    深入理解Java虚拟机视频教程(jvm性能调优+内存模型+虚拟机原理)视频教程

    第4节jvm初体验-内存溢出问题的分析与解决 [免费观看] 00:17:59分钟 | 第5节jvm再体验-jvm可视化监控工具 [免费观看] 00:21:17分钟 | 第6节杂谈 [免费观看] 00:12:37分钟 | 第7节Java的发展历史00:27:24分钟 | ...

    Java开发技术大全(500个源代码).

    overflowExample.java 演示溢出 precedence.java 演示自加运算符的优先级 primeNumber.java 输出100-200之间的所有素数 ranking.java 评定成绩等级 rankingBySwitch.java 用switch语句评定成绩等级 ...

    Java常见面试问题整理.docx

    线程共享:异常:OOM 内存溢出 1.Java堆:对于大多数应用来说,Java堆是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,...

    深入理解JVM内存结构及运行原理全套视频加资料.txt

     第4讲 jvm初体验-内存溢出问题的分析与解决 免费 00:17:59  第5讲 jvm再体验-jvm可视化监控工具 免费 00:21:17  第6讲 杂谈 免费 00:12:37  第7讲 Java的发展历史 00:27:24  第8讲 Java的发展历史续 00:...

    UnderstandingTheJVM:《深入理解Java虚拟机 - Jvm高级特性与最佳实践(第三版)》阅读笔记

    本repository为《深入理解Java虚拟机 - Jvm高级特性与最佳实践(第三版)》阅读笔记,因为第一章主要讲的是Java的发展历史,这里就不做笔记,直接从第2章的"Java内存区域与内存溢出异常"讲起。 第二部分 自动内存...

    java 面试题 总结

    5、运行时异常与一般异常有何异同? 异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,...

    java8rt.jar源码-JVM:学习JVM

    第2章:java内存模型和内存溢出异常 1.运行时数据区域 1.程序计数器:线程私有 2.java虚拟机栈:线程私有,虚拟机栈描述的是java方法执行的内存模型:每个方法在执行的时候都会创建一个栈帧,存储局部变量表、操作数...

    java堆栈的区别 -- 详解

    堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,...

    超级有影响力霸气的Java面试题大全文档

    8、运行时异常与一般异常有何异同?  异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常...

    写了一首 Java 表白诗,女朋友不愁了!

    我在心里开辟了一块你的内存区域 和你的每一次美好邂逅 我都封装成记忆 深深将它压入堆栈 舍不得让它逃逸 追求你的队列很长 并发很高 我也加入了竞争 拼命挣抢着你的爱情锁 却被一直阻塞着 想念的接口没有回应 我...

    C#微软培训资料

    8.4 异常处理语句 .95 8.5 小 结 .100 第三部分 面向对象的 C#.101 第九章 面向对象的程序设计 .101 9.1 面向对象的基本概念.101 9.2 对象的模型技术 .103 9.3 面向对象的分析 .105 9.4 面向对象的设计...

    [开源]用SWT/JFace实现的放大镜软件jZoomer v1.2.0(附源码)

    Bug修正: ·解决内存溢出Bug ·解决字符串乱码Bug `解决拖拽位置不正常Bug 2. 功能添加: ·添加SystemPropertiesReader类,用于解析系统配置文件system.properties ·完成软件的国际化,...

Global site tag (gtag.js) - Google Analytics