一:特定

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

二:体系机构

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虚拟机第二版》一书

Java虚拟机学习笔记(一)之初识的更多相关文章

  1. 《深入Java虚拟机学习笔记》- 第19章 方法的调用与返回

    <深入Java虚拟机学习笔记>- 第19章 方法的调用与返回

  2. 《深入Java虚拟机学习笔记》- 第16章 控制流

    <深入Java虚拟机学习笔记>- 第16章 控制流

  3. 《深入Java虚拟机学习笔记》- 第17章 异常

    <深入Java虚拟机学习笔记>- 第17章 异常

  4. 《深入Java虚拟机学习笔记》- 第13章 逻辑运算

    <深入Java虚拟机学习笔记>- 第13章 浮点运算

  5. 《深入Java虚拟机学习笔记》- 第14章 浮点运算

    <深入Java虚拟机学习笔记>- 第13章 浮点运算

  6. 《深入Java虚拟机学习笔记》- 第8章 连接模型

    Java虚拟机学习笔记(八)连接模型

  7. 《深入Java虚拟机学习笔记》- 第4章 网络移动性

    Java虚拟机学习笔记(四)网络移动性

  8. 《深入Java虚拟机学习笔记》- 第2章 平台无关

    Java虚拟机学习笔记(二)平台无关

  9. Java虚拟机学习笔记——JVM垃圾回收机制

    Java虚拟机学习笔记——JVM垃圾回收机制 Java垃圾回收基于虚拟机的自动内存管理机制,我们不需要为每一个对象进行释放内存,不容易发生内存泄漏和内存溢出问题. 但是自动内存管理机制不是万能药,我们 ...

随机推荐

  1. JavaScript的数据类型及其检测

    一.什么是数据类型 1.基本类型 值是不可改变的 var name = 'java'; name.toUpperCase(); // 输出 'JAVA' console.log(name); // 输 ...

  2. ceph-fuse客户端问题排查流程

    本文讲述了ceph-fuse客户端问题排查基本流程:) 首先查看集群的整体情况 ceph -s 是否有osd挂掉,是否有pg非active ceph-fuse进程是否存在? ps -ef |grep ...

  3. DFS(二):骑士游历问题

    在国际象棋的棋盘(8行×8列)上放置一个马,按照“马走日字”的规则,马要遍历棋盘,即到达棋盘上的每一格,并且每格只到达一次.例如,下图给出了骑士从坐标(1,5)出发,游历棋盘的一种可能情况. [例1] ...

  4. redis RDB 和AOF

    参考文献 Redis源码学习-AOF数据持久化原理分析(0) Redis源码学习-AOF数据持久化原理分析(1) Redis · 特性分析 · AOF Rewrite 分析 深入剖析 redis AO ...

  5. 02(e)多元无约束优化问题- 梯度的两种求解方法以及有约束转化为无约束问题

    2.1 求解梯度的两种方法 以$f(x,y)={{x}^{2}}+{{y}^{3}}$为例,很容易得到: $\nabla f=\left[ \begin{aligned}& \frac{\pa ...

  6. linux应用程序设计--Makefile工程管理

    Makefile文件描述了整个工程的编译.链接等规则.包括:工程中哪些源文件需要编译以及如何编译:需要创建哪些库文件以及如何创建这些库文件.如何产生最终的可执行文件. Makefile相关术语 1.规 ...

  7. 基于 Jmeter 的 web 端接口自动化测试平台(转载)

    框架 功能点 批量导入har包生成接口用例 接口用例分组树形展示 用例编辑失焦自动保存 用例编写提供快捷调试模块 支持多类型参数,json+文本两种校验 支持同一个项目中接口参数传递 提供即时任务+每 ...

  8. C# 中异常抛出捕获机制--throw / try,catch,finally

    try { messagebox.show("true"); } catch { messagebox.show("false"); } finally { m ...

  9. 跨站脚本攻击(selfxss)笔记(三)

    本篇纯文字发表自己对自插型xss的看法 selfxss,顾名思义,自己输入xss脚本,输出仅自己看到,仅xss到自己. 常见的有:查询框的xss.某个账号中,添加自己的分组类等 查询框的xss: 即在 ...

  10. [Linxu] Ubuntu下载mysql

    //下载: sudo apt install mysql-server sudo apt install mysql-client sudo apt install libmysqlclient-de ...