zoukankan      html  css  js  c++  java
  • JVM详解(一)-- JVM与Java体系结构

    本章思维导图
    Alt

    一、Java和JVM

    1.1 JVM是java体系的基石

    Alt

    1. JDK 包含 JRE,JRE 包含 JVM。
    2. JVM(java virtual machine)是虚拟计算机,用于执行字节码文件。JRE(java runtime environment)是 java 运行时环境,包含了 JVM 和 java 核心基础类库(JDBC,lang and util)。 JDK(java development kit)是 java 开发运行环境,包含了 JRE,同时还包含了编译 java 源码的 javac (或称为前端编译器)和用于 java 程序调试分析的工具(JConsole,visualVM等)等。

    基于 JVM 聊一下 java 与 C++ 的区别
    JVM 具有自动内存分配的功能和垃圾回收机制,而C++需要自己管理内存和自己回收内存。
    虽然Java工程师不需要直接与内存分配、垃圾回收打交道,但学习JVM的这些机制对于设计高扩展性应用和诊断运行问题有重要意义。

    1.2 跨平台特性

    1.2.1 java是跨平台的语言

    Alt text

    java通过在不同平台上根据 JVM 规范实现不同的 JVM 实现了 “java 的跨平台”
    注:java 是跨平台的,JVM 不是跨平台的。

    1.2.2 JVM是跨语言的平台

    JVM 只关心字节码文件,字节码文件使得在JVM上进行多语言或者编程成为现实。
    Alt text

    二、JVM介绍

    2.1 基本概念

    1. 虚拟机。分为系统虚拟机(VM ware)和程序虚拟机(JVM,安卓的Dalvik)。
    2. Java虚拟机。执行字节码的虚拟机,对字节码有一套规范。具有动态内存分配、垃圾回收机制。
    3. JVM的位置--JVM是运行在操作系统之上的。

    2.2 整体架构

    Alt text

    2.2.1 Java执行流程

    如下图
    Alt text

    javac :称为前端编译器。
    高级语言翻译成机器指令的过程是由执行引擎完成的

    2.2.2 JVM的指令集

    指令集架构有两种

    • 基于栈的指令集架构。设计和实现更简单,适用于资源受限的系统;零地址指令方式分配指令;指令集小,同样的操作需要的指令多;可移植性好,跨平台性。
    • 基于寄存器的指令集架构:性能优秀、执行高效;同样的操作需要的指令少;完全依赖硬件,可移植性差。

    比如同样实现“2+3”,指令实现为:

    	// 基于栈的指令集架构:
    	iconst_2
    	istore_1 // 2入栈
    	iconst_3
    	istore_2 // 3入栈
    	iload_1  
    	iload_2  // 2和3出栈
    	iadd     // 2 + 3
    	istore_3 // 结果5入栈
    	return
      // 基于寄存器的指令集架构
      mov eax, 2 //将eax寄存器设为2
      add eax, 3 //将eax寄存器的值加3
    

    java反编译的命令

    	// 先要cd 到需要反编译的文件路径下
    	javap -v 文件名.class
    

    2.2.3 JVM的生命周期

    • 启动:通过引导类加载器(bootstrap classloader)创建一个初始类(Init Class)来完成的,这个初始类是由具体 JVM 的实现来指定的。
    • 运行:一个运行中的 JVM 有一个清晰的任务-执行程序,程序开始执行时 JVM 运行,程序结束时 JVM 停止,执行程序时,真正执行的是一个叫做 JVM 的进程。
    • 退出:a.程序正常执行结束 b.程序在执行时遇到了异常或错误而异常终止 c.由于操作系统出现错误而导致JVM异常终止 d.某线程调用 Runime 类或 System 类的 exit 方法,或 Runtime 类的 halt 方法,Runtime 类是单例,对应于 JVM 的“运行时数据区” e.JNI(java 本地接口)规范描述了使用 JNI API 时 JVM 的退出情况。

    三、JVM的发展历程

    3.1 Classsic VM

    第一款商用JVM;只提供解释器,若需使用JIT(即时编译器)编译器,需外挂,二者不能配合工作;Hotspot内置了Classic VM。

    即时编译器可以使得程序在执行期间的速度加快,那为什么不只用即时编译器?

    将字节码指令翻译成机器指令时是需要花费时间的,如果将所有代码都使用即时编译器编译并缓存(而不是选择热点代码),会导致程序在最初启动时会有“卡顿”印象,影响整体的执行速度。
    解释器(逐行解释),响应快,但会重复解析热点代码;即时解释器,响应慢,但对热点代码可缓存。

    3.2 Hotspot VM

    服务端、客户端、移动端都有应用。JDK8中默认使用的 JVM。

    hotspot 为何叫 hotspot?

    “热点代码探测技术”:通过计数器找到最具编译价值的代码,触发即时编译或栈上替换;编译器(负责执行性能)和解释器(负责响应时间)协同工作,在最优化的程序响应时间和最佳的执行性能中取得平衡。

    3.3 JRockit

    专注于服务端。不关注程序的启动速度(响应时间),因此没有解释器的实现,全部代码都由即时编译器编译后执行。是世界上最快的JVM。

    3.4 J9

    市场定位与hotspot接近,但适用于IBM自己的计算机,通用性较差。

  • 相关阅读:
    js 基于可视区域 创建展示区域对应的经纬度二维数组
    主要看思路:区域数据去重 + JavaScript一次性展示几万条数据实例代码
    推荐js库: underscore
    开博缘由 , 可点下看看 http://www.cnblogs.com/jshare
    php--sphinx的使用
    php--validate表单验证实例
    php--validate错误信息提示样式
    php--yii框架中的ajax分页与yii框架自带的分页
    php--jquery操作全选、批量删除、加减行
    php--yii2.0框架的curl
  • 原文地址:https://www.cnblogs.com/cleverziv/p/13908969.html
Copyright © 2011-2022 走看看