JVM-内存模型
来源:互联网 发布:转换别人的淘宝客链接 编辑:程序博客网 时间:2024/06/06 03:11
在Java 虚拟机规范中,对这个区域规定了两种异常状况:
a.如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError 异常;
b.如果虚拟机栈可以动态扩展(当前大部分的Java 虚拟机都可动态扩展,只不过Java 虚拟机规范中也允许固定长度 的虚拟机栈),当扩展时无法申请到足够的内存时会抛出OutOfMemoryError 异常。
如果从内存回收的角度看,由于现在收集器基本都是采用的分代收集算法,所以Java 堆中还可以细分为:新生代和老年代;再细致一点的有Eden 空间、From Survivor 空间、To Survivor 空间等。
如果从内存分配的角度看,线程共享的Java 堆中可能划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer,TLAB)。
不过,无论如何划分,都与存放内容无关,无论哪个区域,存储的都仍然是对象实例,进一步划分的目的是为了更好地回收内存,或者更快地分配内存。
如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError 异常。
本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java 方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native 方法服务。虚拟机规范中对本地方法栈中的方法使用的语言、使用方式与数据结构并没有强制规定,因此具体的虚拟机可以自由实现它。甚至有的虚拟机(譬如Sun HotSpot 虚拟机)直接就把本地方法栈和虚拟机栈合二为一。与虚拟机栈一样,本地方法栈区域也会抛出StackOverflowError 和OutOfMemoryError异常。
虽然Java 虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的应该是与Java 堆区分开来。
Java 虚拟机规范对这个区域的限制非常宽松,除了和Java 堆一样不需要连续的内存和可以选择固定大小或者可扩展外,还可以选择不实现垃圾收集。相对而言,垃圾收集行为在这个区域是比较少出现的,但并非数据进入了方法区就如永久代的名字一样“永久”存在了。这个区域的内存回收目标主要是针对常量池的回收和对类型的卸载,一般来说这个区域的回收“成绩”比较难以令人满意,尤其是类型的卸载,条件相当苛刻,但是这部分区域的回收确实是有必要的。在Sun 公司的BUG 列表中,曾出现过的若干个严重的BUG 就是由于低版本的HotSpot 虚拟机对此区域未完全回收而导致内存泄漏。
根据Java 虚拟机规范的规定,当方法区无法满足内存分配需求时,将抛出OutOfMemoryError 异常。
- [jvm]JVM内存模型
- 【理解JVM】JVM内存模型
- JVM初探 -JVM内存模型
- JVM初窥:JVM内存模型
- 理解 JVM:JVM 内存模型
- JVM内存模型
- JVM内存模型基础知识
- 图解JVM内存模型
- JVM内存模型
- 一 JVM内存模型
- JVM的内存模型
- 图解JVM内存模型
- JVM内存模型
- 图解JVM内存模型
- 【转】jvm 内存模型
- JVM 内存模型
- JVM内存模型
- JVM内存模型
- 测试环境 11g上 ASM磁盘组的管理、迁移、总结 (dgbroker)
- 利用spark进行层次社团发现(louvain算法测试)
- 他山之石-sphinx全文检索之PHP使用教程
- 07 eclipse C/ C++编译含有多个main函数的项目
- 【翻译自mos文章】Clusterware间歇性的hang,命令报CRS-184并且Network Socket Files in /tmp/.oracle or /var/tmp/.oracle被删
- JVM-内存模型
- 黑马程序员——多线程
- Android 系统稳定性 - ANR(二)
- 任务调度quartz(一)quartz在spring中的集成
- html5 notification新特性
- iOS通讯录开发
- 浅谈with语句
- iOS开发——使用Charles进行https网络抓包详解
- XMPP即时通信资料: