zoukankan      html  css  js  c++  java
  • JVM的重要性 从上层应用程序到底层操作系统,到底有哪些东西?

    JVM的重要性

    从上层应用程序到底层操作系统,到底有哪些东西?


    平时开发的应用程序主要基于各种框架,譬如Spring,SpringMVC,Mybatis,而各种框架又是基于Java API来实现的,Java API调用执行是在JVM上的,而JVM则是运行在操作系统上的,操作系统是在物理机器打交道的。

    在框架上进行业务开发,或者学习框架如何使用,是大部分开发者的工作。但是实际上我们不该执着于框架该如何使用,而是应该往下走,一般最后遇到的问题都会到JVM和操作系统的问题。即使现在的 JVM 已经很完善,帮开发者做了很多事,但是我们不该以此为理由不去了解 JVM 的原理。架构师把开发者变成温室里的花朵和温水里的青蛙,如果有一天出现以下问题,该怎么解决:

    • 运行系统卡死,系统无法访问,直接 OOM 。
    • 线上 GC (垃圾回收)有问题,需要 dump 内存,进行分析。
    • 新项目上线,需要对系统进行评估,设置 JVM 的参数。
    • 面试时被问及实际项目中 JVM 参数调优。

    几乎所有的高级语言在交给机器CPU执行之前,都会经历 高级语言 --> 汇编语言 --> 机器指令 的过程,因为计算机是不会直接识别高级语言的。了解高级语言如何转换成能被机器识别的语言,是开发者必须掌握的技能。

    JavaC++多了动态内存分配以及垃圾回收技术,Java的虚拟机帮开发者做了垃圾收集,编译优化等一系列工作,里面的垃圾收集算法有哪些?怎么执行的?JIT编译器是怎么工作的?这些往往也是面试常谈的话题。懂得JVM的内部机构和工作机制,有利于设计高拓展的应用和快速诊断运行时的问题。

    如何学习JVM

    去官网找虚拟机规范(英文版):
    https://www.oracle.com/cn/java/technologies/javase-downloads.html

    找到:Java Language and Virtual Machine Specifications:

    打开之后是:https://docs.oracle.com/javase/specs/index.html ,也就是Java语言和虚拟机的规范。

    可以选择以下书籍,如果是初学,最好学周志明老师的深入理解Java虚拟机,虚拟机规范会直接劝退:

    • Java虚拟机规范(Java SE 8版
    • 深入理解Java虚拟机(JVM高级特性与最佳实践)

    Java规范只是标准,不同的版本规范不一样,同一个版本的规范在不同的虚拟机上有不一样的实现,初学者应该从最热门主流的HotSpot虚拟机开始,也就是Oracle自己推出的Java虚拟机。

    通过cmd可以看出,我装的Java环境使用的就是64位的HotSpot虚拟机:

    如何真正搞懂JVM?

    在了解JVM规范和原理的情况下,自己手动实现一个简易的Java虚拟机。对于大部分人来说,挺难的,但是世间万物,为之则不难,不为,则难。一步登天则难,步步为营则不难。

    语言排行版,目前Java是第二名:
    https://www.tiobe.com/tiobe-index/

    世界上没有最好的编程语言,需要按照具体的使用场景来说话。

    Java跨平台怎么理解?

    Java是一门跨平台语言,所谓跨平台就是,Java源文件会被编译成为字节码文件,不管是Windows,Linux还是Mac,都有其适配的JVM,也就是字节码文件可以随意在这些JVM上去运行。

    Write once,run anywhere.

    其他的语言,例如c语言,编译成为机器码之后,由于底层的机器语言支持不一样,编译后的机器语言文件是不可以跨操作系统运行的。而Java则是把兼容的工作,交给了JVM。不同的JVM负责去适配不同的操作系统。

    所有的Java虚拟机都遵守java虚拟机的规范,语言编写者不需要考虑兼容问题。

    Java虚拟机是Java平台的基石。 它是技术的组成部分,负责硬件和操作系统的独立性,已编译代码的小尺寸以及保护用户免受恶意程序攻击的能力。
    Java虚拟机是抽象的计算机。 像真正的计算机一样,它具有指令集并在运行时操作各种内存区域。 使用虚拟机实现编程语言是相当普遍的。 最知名的虚拟机可能是UCSD Pascal的P代码计算机。

    JVM 跨语言怎么理解?

    JVM是跨语言的平台,很多语言都可以编译成为遵守规范的字节码,这些字节码都可以在Java虚拟机上运行。Java虚拟机不关心这个字节码是不是来自于Java程序,只需要各个语言提供自己的编译器,字节码遵循字节码规范,比如字节码的开头是CAFEBABY

    将各种语言编译成为字节码文件的编译器,称之为前端编译器。而Java虚拟机中,也有编译器,比如即时编译器,此处称为后端编译器。

    Java虚拟机要做到跨语言,目前来看应该是当下最强大的虚拟机。但是并非一开始设计要跨语言。

    跨语言的平台有利于什么?
    由于有了跨语言平台,多语言混合编程就更加方便了,通过特定领域的语言去解决特定领域的问题。

    比如并行处理使用Clojure语言编写,展示层使用JRuby/Rails,中间层用Java编写,每一应用层都可以使用不同的语言编写,接口对于开发者是透明的。不同语言可以相互调用,就像是调用自己语言原生的API一样。它们都运行在同一个虚拟机上。

    何为字节码?

    字节码狭义上是java语言编译而成,但是由于JVM是支持多种语言编译的字节码的,而字节码都是一个标准规范,因为我们应该称其为JVM字节码。

    不同的编译器,可以编译出相同的字节码文件,字节码文件也可以在不同操作系统上的不同JVM中运行。

    因此,Java虚拟机实际上和Java语言并非强制关联的关系,虚拟机只和二级制文件(Class文件)强关联。

  • 相关阅读:
    CodeForces 660D Number of Parallelograms
    【POJ 1082】 Calendar Game
    【POJ 2352】 Stars
    【POJ 2481】 Cows
    【POJ 1733】 Parity Game
    【NOI 2002】 银河英雄传说
    【NOI 2015】 程序自动分析
    【POJ 1704】 Georgia and Bob
    【HDU 2176】 取(m堆)石子游戏
    【SDOI 2016】 排列计数
  • 原文地址:https://www.cnblogs.com/xinxihua/p/14352999.html
Copyright © 2011-2022 走看看