zoukankan      html  css  js  c++  java
  • Java虚拟机学习笔记(一)之初识

    一:特定

       跨平台性、安全性、可移植性。

    二:体系机构

        Java 体系结构包括四个独立但相关的技术:

    • Java程序设计语言
    • Java Class文件格式
    • Java 应用编程接口(API)
    • Java 虚拟机

         用Java编程语言编写源代码,把它编译成Class文件,然后再在Java虚拟机中运行 class 文件。当编写程序时,通过调用类中的方法来访问系统资源(比如I/O)。当程序运行的时候,它通过调用 class 文件中实现了 Java API的方法来满足程序的 Java API调用。

    1、执行引擎

         不同的 Java 虚拟机,执行引擎可能实现的非常不同,目前有以下几类:

    •  最简单的执行引擎就是一次性解释字节码;
    • 即时编译器:第一次被执行的字节码会被编译成本地机器代码,编译出的本地机器代码会被缓存,当方法以后被调用的时候可以重用;
    • 自适应优化器:虚拟机开始的时候解释字节码,但是会监视运行中程序的活动,并且记录下使用最频繁的代码段。程序运行的时候,虚拟机只把那些活动最频繁的代码编译成本地代码,其它的代码由于使用的并不很频繁,继续保留为字节码-----由虚拟机解释它们。
    • 最后一种虚拟机由硬件芯片构成,它用本地方法执行Java字节码,这种执行引擎实际上是内嵌在芯片里的。

    2、Native (JNI)方法

        当 Java 虚拟机是又主机操作系统上的软件实现的时候,Java 程序通过调用本地方法和主机交互。本地方法特定:

    • 其是由其他语言(比如:C,C++,或者汇编语言)编写的,编译成和处理器相关的机器代码;
    • 本地方法保存在动态链接库中,格式是各个平台专有的,和平台相关;
    • 运行中的Java程序调用本地方法时,虚拟机装载包含这个本地方法的动态库,并调用这个方法。

    3、类加载器

       一个Java应用程序可以使用两种类装载器:“启动”(bootstrap)类装载器和用户定义的类装载器。

    • 启动类装载器(这是系统中唯一的)是Java 虚拟机实现的一部分;启动类装载器通常使用某种默认方式从本地磁盘中装载类
    • 用户定义的类装载器能够使用Java编写,能够被编译为 class 文件,能够被虚拟机装载,还能够象其它对象一样实例化。它们实际上只是运行中的Java应用程序可执行代码的一部分;
    • 类仅可见被同个类装载器装载的类。类中使用的其他类也需被加载该类的类装载器进行装载。通过这种方法,Java 的体系结构允许在一个Java应用程序中建立多个命名空间。运行时的Java程序中的每一个类装载器都有它自己的命名空间;
    • 不同类装载器装载的类被存放在不同的命名空间,从而它们不能互相访问。通过这种方法,就能够使用Java类装载器的体系结构来控制任何从不同源文件中装载的代码之间的相互影响,特别是能够阻止恶意代码获取访问和破坏善意代码的权限;

    4、Java API

    • Java API 是运行库集合,提供了一套访问主机系统资源的标准方法;
    • Java 编写程序时,基于标准定义的Java API进行调用访问系统资源;
    • Java 虚拟机和Java API class 文件是任何Java平台都要实现的必要部分。运行Java程序时,虚拟机装载程序的class文件所使用的Java API class文件;
    • 所有被装载的class文件(包括从应用程序中和从 Java API中提取的)和所有已经装载的动态库(包含本地方法)共同组成了在Java 虚拟机上运行的整个程序;

    5、Java 语言

    (1) 优缺点:

    优点:提供开发者效率;

    缺点:

      性能相对于C++不太好

    • 执行速度较慢,牺牲了 性能;
    • 内存管理 --- 垃圾收集器 给程序运行时的性能加入了一些不确定性,无法确认垃圾收集器什么时候开始收集垃圾,无法确认垃圾收集器是否开始收集垃圾,也无法确认垃圾收集到底持续多长时间;
    • 线程调度:Java虚拟机规范讨论线程调度的地方非常笼统,导致程序员无法了解应该如何调度线程,无法控制线程的调度;

      Java 实现了平台无关性,也要付出代价,即最小公分母问题。尽管在各个操作系统之间有许多共性,但每个操作系统通常都有一些自己的特性。想要给程序提供访问任何操作系统的系统服务功能的API,就不得不决定究竟支持哪一种特性。Java API是支持的大部分操作系统都支持的特性,对于少部分不支持这种特性的操作系统上由API模拟来实现它。

       当把Java class文件与Java编程语言之间的紧密联系和Java天生的动态连接特性联系到一起的时候,还要付出代价。因为Java程序是动态连接的,从一个类到另一个类的引用是符合化的,可以被编译出来,成果会被别人窃取;而静态编译成可执行的二进制文件时,其静态连接库的优化程度非常高,它与初始源码的符合程度越小,此时想反编译获取可读代码花费时间比较长。针对动态编译要防止成果被窃取,可使用混淆器,混淆器通过更改类、字段、方法和局部变量名字的方法来修改类,但是它并不更改程序的工作流程。

    (2) 预编译的概念???

    •   把 Java 程序编译成单独的可执行程序的方法能够改善性能,但这通常是以牺牲 Java 的动态扩展能力为代价的;
    • 预编译是进行静态而不是动态的连接,它产生出完全连接的、单独的本地可执行文件,但是这种可执行文件通常失去了运行时动态创建和连接新类型的能力

     PS:参考 《深入理解Java虚拟机第二版》一书

  • 相关阅读:
    FZU-SE-K 第一次累计得分排行榜
    OO第四次总结
    OO第二次总结
    面向对象构造与设计第一次总结
    软件工程实践2019第四次作业
    蹒跚的第一步
    学期导图
    一篇随笔
    【软工】提问回顾与个人总结
    【软工】结对项目博客
  • 原文地址:https://www.cnblogs.com/sandyflower/p/11160071.html
Copyright © 2011-2022 走看看