JVM进阶之路一

   JVM是Java Virtual Machine的简称。意为Java虚拟机-是运行Java程序必不可少的机制。JVM实现了Java语言最大特性:即平台无关性。它并不是实体计算机,所以他的组成也不是什么存储器,控制器,运算器,输入输出设备。JVM放在运行在真实的操作系统中表现的更像应用或者说是进程。而现在使用最广的是Oracle的HotSpot。
   
   虚拟机:VMWare、Visual Box、JVM。前两者都是使用软件模拟屋里CPU的指令集。而后者JVM使用软件模拟Java字节码的指令集。
   
   原理:编译后的Java程序指令并不是直接运行在CPU上,而是JVM去执行。正是使用JVM从而屏蔽了与具体平台相关的信息,是Java语言编译程序只需要生成JVM上运行的目标字节码(.class),即可在多平台运行。JVM在执行字节码时,把字节码解释成具体平台上的机器指令来执行。因此实现Java平台无关性。
  
  1.JVM在JDK中占有的地位。我们知道JDK是Java开发的必备工具库,其中的JRE是Java的运行环境,JVM则是JRE最核心的部分。(看看下图
  
   JVM进阶之路一_第1张图片
   

  2.组成:ClassLoader,Runtime Data Area,Execution Engine,Native Interface
   JVM进阶之路一_第2张图片
   2.1.ClassLoader是负责加载class文件,class文件在文件开头有特定的文件标示,并且ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定。
   
   2.2.Native Interface是负责调用本地接口的。他的作用是调用不同语言的接口给JAVA用,他会在Native Method Stack中记录对应的本地方法,然后调用该方法时就通过Execution Engine加载对应的本地lib。原本多于用一些专业领域,如JAVA驱动,地图制作引擎等,现在关于这种本地方法接口的调用已经被类似于Socket通信,WebService等方式取代。
   
   2.3.Execution Engine是执行引擎,也叫Interpreter。Class文件被加载后,会把指令和数据信息放入内存中,Execution Engine则负责把这些命令解释给操作系统。
   
   2.4.Runtime Data Area则是存放数据的,分为五部分:Stack,Heap,Method Area,PC Register,Native Method Stack。几乎所有的关于java内存方面的问题,都是集中在这块。
    2.4.1PC寄存器:每一个线程都有,在线程创建时创建 指向下一个指令的地址 执行本方法是pc的值为undefined
     
2.4.2方法区:保存类信息 并和永久区关联 jdk7时移动到堆
     2.4.3Java堆:new出来的对象基本-全局共享 和程序开发密切相关 应用系统对象都在 Java堆 所有线程共享Java堆 堆分代GC来说-堆也是分代的  GC的主要工作区间
     2.4.4Java栈:线程私有 由一系列帧组成 帧保存了一个方法的局部变量、操作数栈、常量池指针 每一次方法调用创建一个帧,并压栈。
     2.4.5.Native Method Stack是供本地方法(非java)使用的栈。每个线程持有一个Native Method Stack。

  3.GC算法和种类

  1.引用计数法:对象A只要引用就计数器+1,当引用失效时,计数器就减1,只要对象A的引用计数器的值为0,则对象A就不可能再被使用。
   
   存在的问题:
      1.引用和去引用伴随加法和减法,影响性能。
      2.很难处理循环引用。
  
  2.标记-清除
   
   在标记阶段,通过根节点标记所有从根节点开始的可达对象,因此未被标记的对象就是未被引用的垃圾对象,在清除阶段,清除所有未被标记的对象。

   JVM进阶之路一_第3张图片

  3.标记-压缩

   在标记-清除基础上做了优化,不是简单的清理未标记的对象,而是将所有的存活对象压缩(移动或复制)到内存的一段。之后清理边界外的所有空间。

   JVM进阶之路一_第4张图片
  4.复制算法:相对高效的回收方法
    
   1.不适合存活对象较多的场合 如老年代

   2.将原有的内存空间分为两块,每一次只是用其中的一块,在垃圾回收时,将正在使用的内存中的存活对象复制到未使用的内存块中,之后,清楚正在使用的内存块中的所有对象,交换两个内存的角色,完成垃圾回收。

   JVM进阶之路一_第5张图片
   但是存在空间浪费,整合标记清理思路
           

    总结:
  •   依据对象的存活周期进行分类,短命对象归为新生代,长命对象归为老年代。
  •   根据不同代的特点,选取合适的收集算法
  •   -少量对象存活,适合复制算法
  •   -大量对象存活,适合标记清理或者标记压缩

你可能感兴趣的:(JVM进阶之路一)