一:特定

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

二:体系机构

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. Spring Boot2从入门到实战:统一异常处理

    都说管理的精髓就是“制度管人,流程管事”.而所谓流程,就是对一些日常工作环节.方式方法.次序等进行标准化.规范化.且不论精不精髓,在技术团队中,对一些通用场景,统一规范是必要的,只有步调一致,才能高效 ...

  2. 授权公钥登录,sudo权限脚本

    #!/bin/bash############################################################### File Name: key_auth.sh# V ...

  3. Atlassian In Action - (Atlassian成长之路)

    Atlassian是我工作过程中,使用过的最满意的研发团队管理套装.使用的主要软件包括Jira Software,Confluence,Fisheye/Crucible.理论上还可以再加上Bitbuc ...

  4. 使用纯js写的一个分页

    上图晒效果: 网上确实有很多分页的插件以及开源代码,单本是一个后台开发猿,前台css等样式还驾驭不住,所以就开始自己去写了.其实这个分页原理很简单,就是用ajax往后台传值(当前页码),后台使用lim ...

  5. [AI开发]目标跟踪之行为分析

    基于视频结构化的应用中,目标在经过跟踪算法后,会得到一个唯一标识和它对应的运动轨迹,利用这两个数据我们可以做一些后续工作:测速(交通类应用场景).计数(交通类应用场景.安防类应用场景)以及行为检测(交 ...

  6. S7 300数据块中的变量指定断电保持特性

    利用DB块内变量属性的保持性,勾选上就可以保持了.300PLC数据块默认断电保持.

  7. VMware下的Centos7实践Kvm虚拟化(通俗易懂)

    虽然网上已经有很多关于kvm安装的教程了,但我还是看得头晕,有的教程里安装的包很多,有的很少,也没说明那些安装包的作用是干嘛的,用的命令也不一样,也没解释命令的意思是什么. 我重新写一个教程,尽量通俗 ...

  8. 使用flink Table &Sql api来构建批量和流式应用(1)Table的基本概念

    从flink的官方文档,我们知道flink的编程模型分为四层,sql层是最高层的api,Table api是中间层,DataStream/DataSet Api 是核心,stateful Stream ...

  9. 第八章 Fisco Bcos 国密版本的部署、控制台搭建、合约的部署、sdk 调用

    鉴于笔者以前各大博客教程都有很多人提问,早期建立一个技术交流群,里面技术体系可能比较杂,想了解相关区块链开发,技术提问,请加QQ群:538327407 参考资料 证书说明:https://mp.wei ...

  10. Java面试题汇总---整理版(附答案)

    今天继续为大家整理Java面试题,并涉及数据库和网络等相关知识,希望能帮助到各位开发者. 1,为什么要用spring,Spring主要使用了什么模式? spring能够很好的和各大框架整合,它通过IO ...