一:特定

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

二:体系机构

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. Jenkins的安装与使用(一)

    jenkins是一个广泛用于持续构建的可视化web工具,持续构建说得更直白点,就是各种项目的"自动化"编译.打包.分发部署.jenkins可以很好的支持各种语言(比如:java, ...

  2. 试题--创建三个进程/线程,依次输出 A、B、C

    这是一道机试题,大概的预期执行结果如下图所示 最近刚好在学习linux编程,便使用多线程及多进程分别实现了一遍,其中多线程较为简单,使用0/1信号量在线程间实现生产者/消费者即可:多进程则稍微复杂一些 ...

  3. Java中session与application的异同

    客户端的session 其实是标记了你的请求来自哪个浏览器 问题1:永远都一样吗? 答:重启了浏览器,你的session id就改变了, 结果会导致,再无法取回原来在服务端保存的数据. 问题2:假设客 ...

  4. Vue技术点整理-Vue CLI

    Vue CLI 是一个基于 Vue.js 进行项目快速开发的脚手架 注:具体安装步骤可参考Vue CLI,默认安装的脚手架,是没有service.util等工具类的,以下主要描述如何在脚手架的基础上进 ...

  5. 简述vue中父子组件是怎样相互传递值的(基础向)

    前言 首先,你需要知道vue中父组件和子组件分别指的是什么?   父组件:vue的根实例——用new Vue()构造函数创建的vue实例(实例会有一个挂载点,挂载点里的所有内容可理解为父组件的内容) ...

  6. JVM(八):Java 对象模型

    JVM(八):Java 对象模型 本文将学习对象是如何创建的,对象的内存布局,以及如何定位访问一个对象. 对象创建 当虚拟机碰到一个new指令时,首先检查指令参数能否在常量池中定位一个类的符号引用,并 ...

  7. Java平台调用Python平台已有算法(附源码及解析)

    1. 问题描述 Java平台要调用Pyhon平台已有的算法,为了减少耦合度,采用Pyhon平台提供Restful 接口,Java平台负责来调用,采用Http+Json格式交互. 2. 解决方案 2.1 ...

  8. BZOJ3033 太鼓达人题解

    太鼓达人 时间限制: 1 Sec  内存限制: 128 MB 题目描述 七夕祭上,Vani牵着cl的手,在明亮的灯光和欢乐的气氛中愉快地穿行.这时,在前面忽然出现了一台太鼓达人机台,而在机台前坐着的是 ...

  9. android_ratingBar

    主文件 package cn.com.sxp;import android.app.Activity;import android.os.Bundle;import android.util.Log; ...

  10. DAX 第一篇:数据模型

    DAX是一种专门用于计算数据模型的业务公式的语言,本文以Power BI的关系来学习数据模型. 一,理解数据模型 数据模型是由一组表和关系构成的结构,表和表之间由关系链接,如下图所示的产品数据模型: ...