标签:class 超过 卸载 情况 异常 指示 技术分享 www lower
ref:http://www.cnblogs.com/ityouknow/p/5610232.html
1、JVM的内存结构
1.1:Java程序交给JVM执行,因此Java的内存区域划分实际上是JVM的内存区域划分。
Java源代码(.java)->字节码文件(.class)->jvm加载字节码文件->jvm执行引擎
jvm执行Java程序时,会用一段空间(运行时数据区)存储执行期间的数据与相关信息。内存划分是对jvm运行时数据区进行的内存划分。
1.2、运行时数据区的划分:
堆内存:堆区是所有线程共享的区域。
方法区:又名非堆(Non-Heap),是线程共享区域。
栈 :是线程私有的。
程序计数器:线程私有。
2、各个分区的作用
2.1:堆(Heap):
2.1.1:根据jvm规范,该区域可以是物理上的不连续空间,当堆区无空间完成实例分配,页无法再扩展时,会抛出OutOfMemoryError异常。
2.1.2:几乎所有的实例对象的分配都在堆区完成。该区也是垃圾收集器(GC)管理的主要区域,一般采用分代收集算法进行回收。
2.1.3:堆区又分为新生代和老年代,新生代又分为:Eden空间、FromSurvivor空间和To Survivor空间,默认比例8:1:1。
2.2:方法区(Method Area):
2.2.1:该区存储已被jvm加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
2.2.2:该区的垃圾回收的主要对象是常量池和类型的卸载,也可以选择不实现垃圾回收。
2.2.3:内存分配无法满足时抛出OutOfMemoryError。
2.3:程序计数器(program counter register):
2.3.1:该区是当前线程所执行的字节码的行号指示器,是线程私有内存。
2.3.2:此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。
2.4:JVM栈(JVM Stacks):
2.4.1:该区描述Java方法执行的内存模型,每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
2.4.2:该区存在两种异常:
StackOverflowError异常:线程请求栈深超过jvm允许深度。
OutOfMemoryError异常:jvm无法申请足够的内存时。
2.5:本地方法栈(Native Method Stacks)
该区为jvm调用的Native方法服务,也会抛出StackOverflowError和OutOfMemoryError异常。
标签:class 超过 卸载 情况 异常 指示 技术分享 www lower
原文地址:https://www.cnblogs.com/whtblog/p/8989487.html