JVM理解学习之内存区域分区

在Java中,数据区域分为以下几种,

       程序计数器:程序计数器可以看做是当前线程所执行的字节码的行号指示器,通过这个计数器的值来取得下一次所要执行的指令,在高并发的情况下,线程间执行的切换,为了保证切换回来之后,记录下程序的上一次的执行位置,因此每个线程都维护一个独立的程序计数器,如果执行的是Native方法,则该计数器的值为0.

       虚拟机栈:为每个线程所私有,Java方法在执行时,会创建一个栈帧,来存储局部变量,操作数栈,动态链接,方法出口等等信息,方法从执行到结束的过程对应一个栈帧在虚拟机栈从出栈到入栈过程。存放了byte,boolean,char,short,int ,float,long ,float,double.以及对象引用类型,一个方法需要在栈帧中分配多少的局部变量是确定的,如果线程请求的栈深度大于虚拟机所允许的深度,就会抛出StackOverFlowError异常,如果虚拟机栈可以扩展,在扩展的时候无法申请到足够的内存,就会抛出OOM异常,  

       本地方法栈:和虚拟机栈类似,本地方法栈为Native方法提供服务,而虚拟机栈为Java提供服务,它的实现虚拟机规范没有规定,虚拟机设计的人可以自由实现它。也会抛出SOF异常和OOM异常。

       堆内存:在虚拟机启动的时候创建该数据区域,堆是为了存放几乎所有的对象实例而存在的,在Java虚拟机规范中描述为所有的对象实例都在这里分配,随着JIT编译器的发展和逃逸技术的逐渐成熟,栈上分配。标量替换,也不一定所有的对象都在堆上分配内存。也会抛出OOM异常。

       方法区:为各个线程共享的,用于存储被虚拟机加载的类信息,常量,静态变量,即时编译器编译的代码等数据,该区域的内存回收目标主要是针对常量池的回收和对类型的卸载,也会抛出OOM异常。

       运行时的常量池:为方法区的一部分,CLASS文件的常量池存放编译时生成的各种字面量和符号引用,这部分内容会在类加载进入方法区的时候存放在常量池。运行时也可以添加常量进入常量池,比如String的intern()(返回字符串对象的规范化表示形式)。

       直接内存:  Java1.4版本中加入的NIO类,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存的引用进行操作,。

posted @ 2016-11-30 10:12  阿姆  阅读(127)  评论(0)    收藏  举报