JVM各区域的作用

首先关于JVM运行时我们常遇到的异常,1.OutOfMemoryError 2.stackOverflower

JAVA堆

java heap(堆)是java虚拟机中管理最大的一块内存。heap中存的是程序在运行过程中创建的各种对象以及数组数据(因为需要连续的内存并且空间占用也比较大),如果堆没有内存完成实例分配,而且堆也无法在扩展时,就会报OutOfMemoryError

GC: garbage collection垃圾回收,GC主要针对的heap空间进行回收。

方法区:方法区线程共享,通常用来装载保存类的元数据信息,主要用来保存虚拟机加载的类数据,常量,静态变量以及编译之后的代码等数据。方法区也称永久代,但不代表这个区域和永久代名字一样没有任何垃圾回收,垃圾收集在这个区域特别的少,这个区域的内存回收目标是常量池的回收和类的卸载,通常这个区域表现良好,所以一般忽略这部分的讨论。java虚拟机规范的规定,当方法区无法满足内存分配需求时将报:OutOfMemory error

如下是JDK版本对于的堆和方法区存放数据的变化,本文档主要基于1.6和1.7版本进行阐述。

JVM各区域的作用_第1张图片

程序计数器:是一块空间占用较少的内存,可以看作当前线程字节码运行的行号指示器。任何时刻一个内核同一时刻只能执行一个线程,多线程的场景会有线程间的切换,线程切换后如何重新找到上次运行的位置就是通过程序计数器实现的。每个线程都有自己的程序计数器,程序计数器是线程间私有的不能共享。同时此区域是java 运行时数据区唯一一个不存在OutOfMemory error的区域。

Java虚拟机栈:也是线程私有的,java虚拟机栈描述的是一个方法在执行时的内存模型。每个方法被执行的时候都会同时建立一个栈帧(stack Frame)用于存储局部变量表、操作栈、动态连接、方法出口等,每个方法被调用直至结束的过程就对于一个栈帧在虚拟机中入栈和出栈的过程。在此区域中对应两种异常:(1)如果线程请求的栈深度大于虚拟机提供深度(递归调用)StackOverFlow error(2)如何虚拟机栈可以动态扩展,当扩展时无法申请到足够的内存就会报OutofMemory error

本地方法栈:线程私有,本地方法栈和Java虚拟机栈功能类似,只是Java虚拟机栈为虚拟机执行JAVA服务,而本地方法栈是为本地Native 方法服务。也会抛出StackOverFlow error 和OutofMemory error异常。

异常总结:

1.栈溢出(StackOverFlow error)

2.堆溢出(OutofMemory error: JAVA heap space)

3.永久代(方法区)溢出(OutofMemory error: PermGen space)

4.OutofMemory error:unable create to native thread (本地方法栈)

 

 

 

你可能感兴趣的:(JAVA)