你的位置:首页 > 软件开发 > Java > 《深入理解java虚拟机》笔记(1)运行时数据区域

《深入理解java虚拟机》笔记(1)运行时数据区域

发布时间:2016-02-15 17:00:13
1、Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来。2、运行时数据区域划分  java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个区域,这些区域都有各自的用途, ...

1、Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来。

2、运行时数据区域划分

  java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个区域,这些区域都有各自的用途,创建和销毁时间,有的区域随着虚拟机进程的启动而存在,有的区域则依赖用户线程的启动和结束而建立和销毁,根据《Java虚拟机规范(Java SE 7版)》的规定,java虚拟机分为以下区域。

  《深入理解java虚拟机》笔记(1)运行时数据区域

  2.1、程序计数器(Program Counter Register)

  程序计数器属于线程私有,是一块较小的空间,可以看作是当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。每条线程都有独立的计数器,各条线程之间计数器互不影响,独立存储。此内存区域是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

  2.2、java虚拟机栈(VM Stack)

  和程序计数器一样,都属于线程私有,生命周期与线程相同,描述的是java方法执行的内存模型,每个方法执行都会创建一个栈帧,用于存储局部变量表,操作栈,动态链接,方法出口等信息,每一个方法被调用直至执行完成的过程,就对应一个栈帧在虚拟机栈从入栈到出栈的过程。局部变量表存放了编译期可知的各种数据基本类型(Boolean,byte,char,short,int,float,long,double),以及对象的引用。

  这个区域规定了两种异常状况:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;虚拟机栈在进行动态扩展时,无法申请到足够的内存,将抛出OutOfMemoryError异常。

  2.3、本地方法栈(Native Method Stack)

  本地方法栈与虚拟机栈所发挥的作用非常相似,他们之间区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的Native方法服务。

  举例(StackOverflowError):

  《深入理解java虚拟机》笔记(1)运行时数据区域

 1 public class TestStackSOF { 2   public long stackLenth = 1; 3    4   public void stackSOF(){ 5     stackLenth++; 6     System.out.println(stackLenth); 7     stackSOF(); 8   } 9   public static void main(String[] args) {10     TestStackSOF tss = new TestStackSOF();11     try{12       tss.stackSOF();13     }catch(Throwable e){14       System.out.println("stackLenth: "+tss.stackLenth);15       try {16         throw e;17       } catch (Throwable e1) {18         // TODO Auto-generated catch block19         e1.printStackTrace();20       }21     }22   }23 }

原标题:《深入理解java虚拟机》笔记(1)运行时数据区域

关键词:JAVA

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。