栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JVM学习1: 概述

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JVM学习1: 概述

Java生态圈

Java是目前应用最广泛的软件开发平台之一,随着Java以及Java社区的不断壮大,Java也早已不是简简单单的一门计算机语言了,更是一个平台、一个社区。

作为一个平台:Java虚拟机扮演着举足轻重的作用,Grooy、Scala、JRuby、Kotlin都是Java平台的一部分。

作为一个社区:Java拥有全世界最多的技术拥护者和开源社区支持,有数不清的论坛和社区,从桌面应用软件、嵌入式开发到企业级应用、后台服务器、中间件,都可以看到Java的身影。

Java虚拟机

是一个执行Java字节码的虚拟计算机,有独立的运行机制,运行的Java字节码也不一定需要使用Java语言编译而成。

JVM平台的各种语言可以共享Java虚拟机带来的跨平台性、优秀的垃圾回收器,以及可靠的即时编译器。

Java技术的核心就是Java虚拟机,因为所有的Java程序都运行在Java虚拟机内部。

本质上就是二进制字节码的运行环境,负责装载字节码,解释/编译为对应平台上的机器指令执行。每一条Java指令,Java虚拟机规范都有详细定义。

特点:

  • 一次编译,到处运行
  • 自动内存管理
  • 自动垃圾回收

JVM整体结构

HotSpot VM是目前高性能虚拟机的代表。

他使用解释器和即时编译器并存的架构。

Java代码执行流程
  • Java源码
  • Java编译器
    • 词法分析
    • 语法分析
    • 语法/抽象语法树
    • 语义分析
    • 注解抽象语法树
    • 字节码生成器
  • 生成字节码文件
  • Java虚拟机
    • 类加载器
    • 字节码校验器
    • 翻译字节码/JIT编译器
  • 操作系统
Java架构模型 基于栈的指令集架构
  • 设计和实现更简单,适用于资源受限的系统
  • 避开寄存器分配难题,使用零地址指令方式分配
  • 指令流中的指令大部分是零地址指令,执行过程依赖操作栈,指令集更小,编译器容易实现
  • 不需要硬件支持,可移植性更好,更好的实现跨平台
基于寄存器的指令集架构
  • x86的二进制指令集
  • 完全依赖硬件,可移植性差
  • 性能优秀,执行效率更高
  • 花费更少的指令

大部分情况下,基于寄存器的指令集往往都以一地址指令、二地址指令和三地址指令为主,而基于栈式架构的指令集却是以零地址指令为主。

总结

由于跨平台的设计,Java指令都是根据栈来设计的,不同平台CPU架构不同,所以不能设计为基于寄存器的。优点是跨平台、指令集小、编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。

查看简单程序指令集

程序代码:

public static void main(String[] args) {
	int i = 2 + 3;
}

查看指令集:

> javap -v Test1.class

Classfile /D:/____/Test1.class
  Last modified 2021-10-27; size 382 bytes
  MD5 checksum 28ec587cf91ad0b3ba3642d6cbd4a04d
  Compiled from "Test1.java"
public class Test1
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #3.#19         // java/lang/Object."":()V
   #2 = Class              #20            // Test1
   #3 = Class              #21            // java/lang/Object
   #4 = Utf8               
   #5 = Utf8               ()V
   #6 = Utf8               Code
   #7 = Utf8               LineNumberTable
   #8 = Utf8               LocalVariableTable
   #9 = Utf8               this
  #10 = Utf8               LTest1;
  #11 = Utf8               main
  #12 = Utf8               ([Ljava/lang/String;)V
  #13 = Utf8               args
  #14 = Utf8               [Ljava/lang/String;
  #15 = Utf8               i
  #16 = Utf8               I
  #17 = Utf8               SourceFile
  #18 = Utf8               Test1.java
  #19 = NameAndType        #4:#5          // "":()V
  #20 = Utf8               Test1
  #21 = Utf8               java/lang/Object
{
  public Test1();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."":()V
         4: return
      LineNumberTable:
        line 1: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   LTest1;

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=1, locals=2, args_size=1
         0: iconst_5
         1: istore_1
         2: return
      LineNumberTable:
        line 4: 0
        line 5: 2
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       3     0  args   [Ljava/lang/String;
            2       1     1     i   I
}
SourceFile: "Test1.java"
JVM生命周期

启动:Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是有虚拟机的具体实现指定的。

执行:执行一个Java程序。

退出:程序正常结束、遇到异常而终止、System.exit方法、Runtime.halt方法等。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/351640.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号