JVM包含的几个分区

   作为学习java的孩纸,谈到java会想到跨平台,一次编译,处处运行的说法。它实现跨平台的机制是利用java虚拟机也就是JVM(java Virtual Machine)。百度定义为:JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

       java的跨平台大概的执行过程是:我们编写的.java文件进过java编译器编译为.class文件,也就是java的字节码文件,然后JVM把java的字节码文件根据java解释器解释成机器指令执行。编译过程如下图:


      java源码编译的过程:1、分析和输入到符号表 2、注解处理 3、语义分析和生成class文件

   最后生成的class文件有以下几部分:

             ①结构信息:包括class文件格式版本号及各部分的数量与大小的信息

              ②原数据:对应与java源码中声明与常量的信息。包含类/继承的超类/实现的接口的声明的信息、域与方法声明信息和常量池。

              ③原数据:对应于java源码中语句和表达式对应的信息。包含字节码、异常处理器表、求值栈与局部变量区大小、求值栈的类型记录、调试符号信息。

      

   java由四方面组成:java编程语言、java类文件格式、java虚拟机和java应用程序接口(java API)。它们的关系如下:



      java语言编写并编译的程序运行在java平台上,java平台有一个结构,从上到下,这个图片是网上的(如下图),JVM处于核心的位置,它让程序运行在不同系统的时候可以不管底层操作系统和硬件。JVM有两种机制:

      类装载子系统:装载具有适合名称的类或接口(我把它理解为存储或包装类和接口)

     执行引擎:负责执行包含在已装载的类或接口中的指令(我把它理解为根据指令执行相应的类或接口)


  再看看JVM的分区:

     JVM分为四个区,分别为:方法区,java堆(堆内存),java栈(栈内存),本地方法栈及其他隐含寄存器。

     先说类执行机制:JVM是基于堆栈的虚拟机,JVM为每个新创建的线程都分配一个堆栈。JVM对堆栈只进行两种操作:以帧为单位的压栈和出栈操作。JVM执行class字节码,线程创建后,都会产生程序计数器(PC)和栈(Stack),程序计数器存放下一条要执行的指令在方法内的偏移量,栈中存放一个个栈帧,每个栈帧对应着每个方法的每次调用,而栈帧又是有局部变量区和操作数栈两部分组成,局部变量区用于存放方法中的局部变量和参数,操作数栈中用于存放方法执行过程中产生的中间结果。栈的结构如下图所示:

      

   方法区:它是保存方法代码(编译后的java代码)和符号表。存放了要加载的类信息、静态变量、final类型的常量,属性和方法信息。JVM用持久代来存放方法区,可通过-XX:PermSize和-XX:MaxPermSize来指定最小值和最大值。

   堆内存:即所有通过new创建的对象的内存都在堆中分配。其大小可以通过-Xmx和-Xms来控制。操作系统记录空闲内存地址的是用链表存储的,当系统发出请求的时候,会遍历这个链表,找出第一个空间大于所申请空间的堆结点,然后把这个结点从链表中删除,并把这个结点的空间分配给程序。而且在这块内存空间的首地址记录本次分配的大小,但是不能保证这个空间一定可以全部用到,那么用完之后,系统会自动的将多余的部分又放回到链表中去。所以堆内存用起来速度慢,而且容易产生碎片,但是它获取空间比较灵活,也比较大。它是向高地址扩展的数据结构,不是连续的内存区域。

   内存:在windows下,栈是向低地址扩展的数据结构,是一块连续的内存区域。栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是固定的(是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。 由系统自动分配,速度较快。但我们是无法控制的。

       本地方法栈:用于支持native方法的执行,存储了每个native方法调用的状态。对于本地方法接口,实现JVM并不要求一定要有它的支持,甚至可以完全没有。Sun公司实现Java本地接口(JNI)是出于可移植性的考虑,当然我们也可以设计出其它的本地接口来代替Sun公司的JNI。但是这些设计与实现是比较复杂的事情,需要确保垃圾回收器不会将那些正在被本地方法调用的对象释放掉。关于native,我们在写SSH,配置hibernate的数据库主键生成方式的时候也会用到native,虽然跟这没有什么关系,但是还是可以帮助理解的。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值