1.运行时数据区域
1.1 程序计数器
记录当前线程所执行字节码的行号指示器。线程私有,占有很小一块内存,唯一一块没有OutOfMemoryError的区域。
1.2 java虚拟机栈
线程私有,生命周期与线程一样,描述的是Java方法执行的区域:每个方法被执行就回生成一个栈帧(Stack Frame)用于存储局部变量表,操作栈,动态链接,方法出口等信息。
局部变量表存储编译器可知的各种基本数据类型(boolean byte char short int float long double)对象引用(reference)和returnAddress类型,其中float和double占用两个局部变量空间Slot,其余占用一个。
两种异常:线程请求的深度大于虚拟机允许深度,StackOverFlowError,
无法申请到足够的空间:OutOfMemoryError
1.3本地方法栈
与虚拟机栈的作用相同,只不过执行的是本地方法Native,HotSpot把java虚拟机栈和本地方法栈合二为一。
无法申请到足够的空间:OutOfMemoryError unable to cteate new native thread
1.4 java堆(java Heap)
是内存中占用最大的一块,被所有线程共享。所有的对象实例和数组都在这上面分配,但是随着JIT编译器的发展和逃逸技术的成熟等,也不是那么绝对了。
Java堆是内存回收的主要区域,也成为“GC堆”(Garbage Collected Heap)
如果如法申请到足够的空间抛出OutOfMemoryError : Java heap space
1.5 方法区
用来存储虚拟机加载的类信息,常量,静态常量,即时编译器编译后的代码等。也就是平时大家说的永久代,本质上并不等价,或者说使用永久代实现方法区而已。一般方法区内存回收成绩不令人满意。
如果如法申请到足够的空间抛出OutOfMemoryError :PermGen space
1.6运行时常量池 (Runtime Constant Pool)
是方法区的一部分,Class文件除了有类的版本信息、字段方法接口外,还有一项信息是常量池,用于存放编译器生成的各种字面量和符号引用,这部分信息在类加载后存放到方法区的运行时常量池中。
具有动态性,可以使用String类的intern()方法加入。
1.7直接内存
并不是虚拟机运行时数据区的一部分。JDK1.4中引入了NIO类,引入了一种基于通道与缓冲区的I/O方式,可以使用Native直接分配堆外内存,避免了再Java堆和Native堆中来回复制数据。
不会受到Java堆内存限制,但会受到机器总内存的限制。
如果如法申请到足够的空间抛出OutOfMemoryError
2.对象访问
Object obj = new Object();
Object obj 会反映到java栈的本地变量表中,作为一个reference数据类型出现。New Object 会反映到堆中。Reference规定了一个指向对象的访问,主流访问方式有两种:
·句柄访问,java堆中专门开辟出一块句柄池,reference指向句柄池,句柄池中包含了实际的对象地址,优点:reference稳定不用更改。
·直接访问,reference直接指向对象,优点:速度快,Hotspot采用这种方式 。
3.OutOfMemoryError异常
3.1Java堆异常
堆的最小值:-Xms 如-Xms20m
堆的最大值 -Xmx 如果设为一样的则可避免堆自动扩展。
年轻代大小: -Xmn
-XX:+HeapDumpOnOutOfMemoryError 当内存溢出时Dump出当前的内存堆转存快照。
Eclipse中虚拟机参数设置:debug As-->open dubug dialog
生成之后使用Eclipse Memory Analyzer 进行堆转储文件分析(需要安装MAT插件)。
3.2虚拟机栈和本地方法栈溢出
-Xss:设置每条线程的Statck大小.在JDK1.5以后默认是1M,之前是256K
抛出StackOverFlow异常:操作系统分配给每个线程的内存是有限的,机器总内存减去Xmx再减去MaxPermSize,程序计数器占内存很少忽略,剩下的内存被虚拟机栈和本地方法栈瓜分,每个线程分到的栈容量越大,分配的线程数就小。正常情况栈深度1000-2000没问题,如果是建立更多线程导致的内存溢出,在不能减少线程的情况下,只能通过减小Xmx和栈容量来换取更多线程。
3.3方法区和运行时常量池溢出
-PermSize :方法区的初始容量,默认是物理内存的1/64
-MaxPermSize :最大方法区容量。
3.4本机直接内存溢出
-XX:MaxDirectMemorySize 本机直接内存大小,如果不指定,则与Xmx一样
- 大小: 49.3 KB
分享到:
相关推荐
JAVA内存区域与内存溢出异常归类.pdf
这是自己读《深入理解Java虚拟机》时候用XMind建立的思维导图,目的是为了能够帮助自己整理、梳理相关的知识以及方便自己日后的回顾,帮助自己建立起关于JVM的知识体系,里边也有一些对相关内容的补充,通过备注的...
主要介绍了Java内存区域与内存溢出异常详解的相关资料,需要的朋友可以参考下
- 第2章 Java内存区域与内存溢出异常- 2.4 实战:OutOfMemoryError异常2.4.4 本机直接内存溢出直接内存(Direct Memory
第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 运行...
第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内存分配的原理,这对于以后JAVA的学习会有更深刻的理解。下面来看看详细介绍。
Tomcat内存溢出的三种情况及解决办法分析 Tomcat内存溢出的原因 在生产环境中tomcat内存设置不好很容易出现内存溢出。造成内存原因是不一样的,当然处理方式也不一样。 这里根据平时遇到的情况和相关资料进行一个...
第4节jvm初体验-内存溢出问题的分析与解决 [免费观看] 00:17:59分钟 | 第5节jvm再体验-jvm可视化监控工具 [免费观看] 00:21:17分钟 | 第6节杂谈 [免费观看] 00:12:37分钟 | 第7节Java的发展历史00:27:24分钟 | ...
overflowExample.java 演示溢出 precedence.java 演示自加运算符的优先级 primeNumber.java 输出100-200之间的所有素数 ranking.java 评定成绩等级 rankingBySwitch.java 用switch语句评定成绩等级 ...
线程共享:异常:OOM 内存溢出 1.Java堆:对于大多数应用来说,Java堆是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,...
第4讲 jvm初体验-内存溢出问题的分析与解决 免费 00:17:59 第5讲 jvm再体验-jvm可视化监控工具 免费 00:21:17 第6讲 杂谈 免费 00:12:37 第7讲 Java的发展历史 00:27:24 第8讲 Java的发展历史续 00:...
本repository为《深入理解Java虚拟机 - Jvm高级特性与最佳实践(第三版)》阅读笔记,因为第一章主要讲的是Java的发展历史,这里就不做笔记,直接从第2章的"Java内存区域与内存溢出异常"讲起。 第二部分 自动内存...
5、运行时异常与一般异常有何异同? 异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,...
第2章:java内存模型和内存溢出异常 1.运行时数据区域 1.程序计数器:线程私有 2.java虚拟机栈:线程私有,虚拟机栈描述的是java方法执行的内存模型:每个方法在执行的时候都会创建一个栈帧,存储局部变量表、操作数...
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,...
8、运行时异常与一般异常有何异同? 异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常...
我在心里开辟了一块你的内存区域 和你的每一次美好邂逅 我都封装成记忆 深深将它压入堆栈 舍不得让它逃逸 追求你的队列很长 并发很高 我也加入了竞争 拼命挣抢着你的爱情锁 却被一直阻塞着 想念的接口没有回应 我...
8.4 异常处理语句 .95 8.5 小 结 .100 第三部分 面向对象的 C#.101 第九章 面向对象的程序设计 .101 9.1 面向对象的基本概念.101 9.2 对象的模型技术 .103 9.3 面向对象的分析 .105 9.4 面向对象的设计...
Bug修正: ·解决内存溢出Bug ·解决字符串乱码Bug `解决拖拽位置不正常Bug 2. 功能添加: ·添加SystemPropertiesReader类,用于解析系统配置文件system.properties ·完成软件的国际化,...