zoukankan      html  css  js  c++  java
  • java虚拟机的基本结构

    java虚拟机的基本结构

    类加载子系统:

    当程序使用new关键字,或其他方式触发进行类的加载时,类加载子系统负责找到对应的类的class文件,根据class信息使用类加载器进行类的加载。类加载的三个过程:装载,链接,初始化。

    方法区:

    保存着类加载器加载进来的class信息。(包括类的字段,方法,还有运行时的常量池)。在jdk1.6和jdk1.7中,方法区也可以理解为永久区(Perm)。如果运行时产生的类过多,导致方法区没有空间存放类的信息,虚拟机就会抛出内存溢出错误。

    java堆:

    通过new关键字,保存根据方法区中保存的类的信息实例化出的java对象,几乎所有java对象实例都存放在java堆中,Java堆是所有线程共享的。

    如上图所示:java堆分为新生代(Young)和老年代(old),新生代包括eden区,from区和to区,from区和to区大小相同(from区和to区有特殊功能,当学习垃圾回收算法时就会明白它的作用)。一般来说,对象首先分配在eden区,在一次新生代垃圾回收后,如果对象还存活,对象的年龄就会加1,当对象年龄到达一定的条件,就会被认定为老年对象,从而进入老年区。

    直接内存:

    直接内存是直接想系统申请的,访问速度优于java堆,对于读写频繁的场合可能会考虑放到直接内存中。

    java栈:

    每个虚拟机线程都有一个私有的Java栈,Java栈中保存着栈帧,每个函数对应一个栈帧,栈帧保存着方法的局部变量,方法参数。栈是一块先进后出的数据结构,只有两种操作,入栈和出栈,每当调用一个函数就会将这个函数对应的栈帧压入栈中,当这个函数运行结束就会将这个栈帧弹出java栈,所以栈顶的栈帧就是当前执行的函数。

    栈帧结构

    • 局部变量表:保存局部变量

    • 操作数栈:用于进行计算操作,比如操作数栈栈顶两个元素为75和3,当执行iadd指令时,会将操作数栈栈顶的75和3弹出进行加法计算,然后将计算结果78压入操作数栈中。

    • 帧数据区:帧数据区保存着访问常量池的指针,方便程序访问常量池。还保持有常量处理表,一边发生异常时继续执行下去。

      例如:

      Exception table:
      	from	to 	target	type
            4       16 	 19	any
            19	21	 19	any
      

      上面的常量处理表表示:

      在字节码偏移量4~16字节可能抛出任意异常,如果遇到异常,则跳转到字节码便宜19处执行。

    • 栈上分配:栈上分配时java虚拟机提供的一项优化技术,它的基本思想是,对于那些线程私有的对象(即不可能被其他线程访问的对象),可以将它们分配在栈上,而不是分配在堆上。这样的好处是:当函数调用结束后栈帧出栈可以自行销毁对象,不需要垃圾回收器介入,可以提高性能。

    本地方法栈:

    与Java栈类似,但本地方法中调用的是本地(由c语言编程)的方法。

    PC寄存器:

    PC寄存器是每个线程的私有空间,虚拟机会为每个线程创建一个PC寄存器,用于保存当前线程正在执行的指令。当执行的本地方法时,那么PC寄存器的值就是undefined。

  • 相关阅读:
    Fluent NHibernate之旅
    IOC之Unity
    使用AutoMapper实现Dto和Model之间自由转换
    javamail邮件发送
    webservice整合spring cxf
    spring 集成mongo配置
    mongodb安装 win7版
    freemarker之list和map
    servlet生命周期
    ArrayList和LinkedList和Vector源码分析
  • 原文地址:https://www.cnblogs.com/zdl2234/p/12341734.html
Copyright © 2011-2022 走看看