知识点1-JVM的认识

1、JVM在JDK中的位置

JDK其中有一部分是JRE,JRE是JAVA运行环境

JVM是JRE最核心的部分

JVM四大部分:ClassLoader、Runtime Data Area、Execution Engine、Native Interface

JVM大致结构的图:

    1. ClassLoader是负责加载class文件,class文件在文件开头有特定的文件标识,并且ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定
    2. Native Interface是负责调用本地接口的。他的作用是调用不同语言的接口给JAVA用,他会在Native Method Stack中记录对应的本地方法,然后调用该方法时就通过Execution Engine加载对应的本地Lib。原本多于用一些专业领域,如JAVA驱动,地图制作引擎等,现在关于这种本地方法接口的调用已经被类似于Socket通信,WebService等方式取代。
    3. Execution Engine是执行引擎,也叫Interpreter。Class文件被加载后,会把指令和数据信息放入内存中,Execution Engine则负责把这些命令解释给操作系统。
    4. Runtime Data Area则是存放数据的,分为五部分:Stack,Heap,Method Area,PC Register,Native Method Stack.几乎所有的关于java内存方面的问题,都是集中在这块。
    5. Run-time Data Areas如下图:
    6. Heap是用来存放对象信息的,和Stack不同,Stack代表着一种运行时的状态。栈是运行时单位,解决程序该如何执行的问题,而堆是存储的单位,解决数据存储的问题。Heap是伴随着JVM的启动而创建,负责存储所有对象实例和数组的。堆的存储空间和栈一样是不需要连续的,它分为Young Generation和Old Generation两大部分。
    7. PC Register是程序计数寄存器,每个JAVA线程都有一个单独的PC Register,他是一个指针,由Execution Engine读取下一条指令。如果该线程正在执行java方法,则PC Register存储的是正在被执行的指令的地址,如果是本地方法,PC Register的值没有定义。
  1. JVM运行原理

Java程序被javac工具编译为.class字节码文件之后,我们执行java命令,.class文件被JVM中的Class Loader加载,可以看出JVM的启动是通过JAVAPAth下的java.exe或者java进行。

调用操作系统API判断系统的CPU架构,根据对应的CPU类型寻找位于JRE目录下的/lib/jvm.cfg文件,然后通过该配置文件找到对应的jvm.dll文件,初始化jvm.dll并且挂接到JNIENV结构的实例上。

JVM管理并且分配对应的内存来执行程序,同时管理垃圾回收。知道程序结束,一种情况是JVM的所有非守护线程停止,一种情况是程序调用System.exit().JVM的生命周期也结束。

  1. JVM的内存管理和垃圾回收
    1. JVM中的内存管理主要是指JVM对于Heap的管理,因为Stack、PCRegister和Native Method Stack都是和线程一样的生命周期,在线程结束时自然可以被再次使用。
      1. 栈的管理

JVM允许栈的大小固定或者动态变化的,我们一般通过减少常量,参数的个数来减少栈的增长,在程序设计时,我们把一些常量定义到一个对象中,然后俩引用他们可以体现这一点。少用递归调用也可以减少栈的占用。栈不需要垃圾回收的,尽管说垃圾回收是java内存管理的一个很热的话题,栈中的对象如果用垃圾回收的观点来看,他永远是live状态,不需要回收

        1. 栈超过允许大小,会抛出StackOverflowError
        2. 当Java栈试图扩展时,没有足够的存储器来实现扩展,JVM会报OutOfMemoryError
    1. 垃圾回收

JVM中会在以下情况除法回收:对象没有被引用,作用域发生为捕捉异常

垃圾回收的三种算法:标记清除算法、复制算法、标记整理算法+

垃圾回收器:Serial GC、ParNew GC、Parrallel Scavenge GC、ParallelOld、Serial Old、CMS

GarbageFirst

  1. JVM的数据类型

JVM自己定义了一个抽象的存储数据单元,叫做Word,一个字足够大以持有byte、char、short、int、float、reference或者returnAdress的一个值,两个字则足够持有更大的类型long、double。它通常是主机平台一个指针的大小,如32位的平台上,字是32位。

JVM是一个非常优秀的JAVA程序

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值