Java虚拟机一 运行时数据区(栈、堆、方法区等)

Java虚拟机的内存管理主要分两点:内存分配以及内存回收。·java

1、内存分配图:数组

注: 所占区域的大小与实际的内存大小比例并没有直接关系。多线程

解读:.net

一、如图,分红两种颜色的内存区域,其中蓝色的是线程隔离的数据区,也就是说每个线程都有本身的这么一个区域存放本身的数据,而青色区域则是线程共享的,里面的数据为全部线程共有,原则上都有权限访问。线程

二、程序计数器:翻译

用途:用来给程序导航指路的。这个是一块较小的内存空间,能够看作是当前线程执行的字节码的行号指示器。理解就是虚拟机把java源代码编译成了字节码,而后程序被执行,可是程序执行是须要顺序的,何时该执行什么代码呢?就是靠这个程序计数器来实现的,字节码解释器在工做的时候会改变这个计数器的值,来选取下一条须要执行的字节码指令。对象

特色:blog

(1)、每一个线程一个。你们知道,所谓的多线程事实上是把时间进行切片而后把细碎的时间无序的分配给多个线程使用,cpu在多个线程之间切换,看起来就像是多个线程同时执行。在频繁的线程切换中药保证每个线程在被执行的时候都可以正确的执行下一行代码,就须要给每个线程分配一个独立的程序计数器。因此程序计数器是在蓝色区域,是每个线程都独立拥有的,数据线程隔离。接口

(2)、由于是记录一个虚拟机字节码指令地址的,因此不会有内存溢出。内存

注意:若是线程执行的是一个java方法,这个计数器记录的是正在执行的续集字节码的指令地址,而若是正在执行的是一个Native方法,则计数器为空。
    Native方法:若是翻译的话是翻译成“本地方法”。理解的话就是一个java接口,可是它的实现不是使用java语言。详细一点的介绍一篇博客:                                http://blog.csdn.net/wike163/article/details/6635321。

 三、Java虚拟机栈:

用途:描述方法执行的内存模型,在该线程上,每个方法执行都会建立一个栈帧(一方法一栈帧),每个方法的调用到执行完成的过程就是一个栈帧在虚拟机中的入栈到出栈的过程。

特色:

(1)、Java虚拟机栈是线程私有的;

(2)、每个方法对应的栈帧主要用来存储每个方法的局部变量表、操做数栈、动态连接、方法出口等信息(具体后面讨论);

(3)、在通常意义理解上的内存管理分为栈和堆,其中的栈指的是虚拟机栈中的栈帧中的局部变量表;

(4)、异常:

Stack Overflow异常:当请求的栈深度大于虚拟机所容许的栈深度出现;

OutOfMemoryError异常:当栈进行动态扩展,没法申请到足够的内存时出现;

(5)、栈帧的局部变量表须要的内存空间在编译期间完成分配,而当方法运行的时候是不会发生改变的,这个和类同样,类的对象须要的内存空间在类加载的时候就已经肯定,分配对象内存的时候不会发生改变。

 

四、本地方法栈:

用途:与java虚拟机栈相似,都是用来执行方法,区别是java虚拟机栈执行的是java方法,而本地方法栈执行的是Native方法。

特色:不是每一种java虚拟机都有本地方法栈,一些虚拟机中将它与java虚拟机合二为一。

 

五、Java堆:

用途:存放类实例对象和数组;

特色:

(1)、全部运行时数据区最大的一块,GC(垃圾收集管理器)的主场;

(2)、OutOfMemoryError异常:当堆中没有内存能够用来完成类实例的分配了,并且也没有办法再扩展大小的时候会出现OutOfMemoryError异常;

(3)、是全部线程共享的区域;

 

五、方法区(Method Area):

用途:用于存储虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。(java虚拟机规范把方法区描述为堆的一个逻辑部分,可是它是与堆不同的)

特色:

(1)、这个区域的垃圾回收是颇有必要的,虽然效率上是很低的。垃圾收集的对象主要是常量池的回收以及对类型的卸载。

(2)、异常:当方法区没法知足内存分配需求的时候将出现OutOfMemoryError异常。

(3)、这个区域也是全部线程共享的。

六、运行时常量池:

用途:一个类在编译的时候会生成各类字面量和符号引用,这部份内容在类加载时将会进入方法区的运行时常量池进行存放。

特色:

(1)、它是方法区的一部分(JDK1.6以后常量池被放入堆空间中);

(2)、具有动态性;上面说的运行时常量池是存放在类加载的时候产生的常量,可是在运行的时候其实也能够把新的常量放入池中,如String 的intern方法;这个方法会把字符串放入运行时常量池中,并返回该字符串,做用是重用字符串,即当调用这个方法的时候会去运行池常量中检查是否已经存在相同的字符串,如果,则指向该字符串,若不是,则把该字符串放入运行时常量池中并返回该字符串。

(3)、异常:当常量池没法申请到内存时会抛出OutOfMemoryError异常。

相关文章
相关标签/搜索