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虚拟机第二版》一书
Java虚拟机学习笔记(一)之初识的更多相关文章
- 《深入Java虚拟机学习笔记》- 第19章 方法的调用与返回
<深入Java虚拟机学习笔记>- 第19章 方法的调用与返回
- 《深入Java虚拟机学习笔记》- 第16章 控制流
<深入Java虚拟机学习笔记>- 第16章 控制流
- 《深入Java虚拟机学习笔记》- 第17章 异常
<深入Java虚拟机学习笔记>- 第17章 异常
- 《深入Java虚拟机学习笔记》- 第13章 逻辑运算
<深入Java虚拟机学习笔记>- 第13章 浮点运算
- 《深入Java虚拟机学习笔记》- 第14章 浮点运算
<深入Java虚拟机学习笔记>- 第13章 浮点运算
- 《深入Java虚拟机学习笔记》- 第8章 连接模型
Java虚拟机学习笔记(八)连接模型
- 《深入Java虚拟机学习笔记》- 第4章 网络移动性
Java虚拟机学习笔记(四)网络移动性
- 《深入Java虚拟机学习笔记》- 第2章 平台无关
Java虚拟机学习笔记(二)平台无关
- Java虚拟机学习笔记——JVM垃圾回收机制
Java虚拟机学习笔记——JVM垃圾回收机制 Java垃圾回收基于虚拟机的自动内存管理机制,我们不需要为每一个对象进行释放内存,不容易发生内存泄漏和内存溢出问题. 但是自动内存管理机制不是万能药,我们 ...
随机推荐
- Appium+python自动化(十六)- ADB命令,知否知否,应是必知必会(超详解)
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态. adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或 ...
- CentOS java生成文件并赋予权限的问题
2.检查文件是否允许: file.canExecute(); – return true, file is executable; false is not. file.canWrite(); – r ...
- Git使用小技巧之挑拣合并
先想想一个情况,现在我们有一个功能急需要发布到线上,但是这个功能相关的代码所在的测试分(test)支有很多不应该发布的代码,那么这个时候我们就需要将与这个代码相关的提交选择性的合并到master上并发 ...
- lambda匿名函数和他的小伙伴(处理大量数据的时候用到)
lambda匿名函数 主要是为了解决一些简单的需求而设计的一句话函数 #计算n的n次方 def func(n): return n**n f = lambda n : n ** n 语法: 函数名 = ...
- 数字IC前后端设计中的时序收敛(六)--Max Fanout违反
本文转自:自己的微信公众号<数字集成电路设计及EDA教程>(二维码见博文底部) 里面主要讲解数字IC前端.后端.DFT.低功耗设计以及验证等相关知识,并且讲解了其中用到的各种EDA工具的教 ...
- Oracle数据库---触发器
SQL> --当我们对empnew执行删除操作之后,它就会出现一个提示信息,提示:这是删除操作!SQL> CREATE TRIGGER first_trigger 2 AFTER DELE ...
- Android 装逼技术之暗码启动应用
什么是暗码? 在拨号盘中输入*#*#<code>#*#*后,APP 可以监控到这些输入,然后做相应的动作,比如启动应用,是不是有点骚. 下面看下这个骚操作是如何实现的. 效果预览 源码 D ...
- c++学习书籍推荐《Exceptional C++ Style》下载
百度云及其他网盘下载地址:点我 编辑推荐 软件“风格”所要讨论的主题是如何在开销与功能之间.优雅与可维护性之间.灵活.性与过分灵活之间寻找完美的平街点.在本书中,著名的C++大师Herb Sutter ...
- linux下运行python3出现TypeError: a bytes-like object is required, not 'str'
目标:用python将中文存入csv,且中文正常显示. 环境:linux,python3 百度N久,方法都不行或是比较复杂. 以上代码用python3运行后,出现TypeError: a bytes- ...
- liunx某台服务器无法访问其他服务器!!!!!!!!
针对于可以ping通ip地址,但是无法访问端口!!! 访问端口卡死,未响应, 例如mysql出现当前主机无法远程连接数据库,而其他主机都可以 前提条件:防火墙,mysql账号ip限制问题已经解决 问题 ...