`

2、《深入理解java虚拟机》

 
阅读更多

目录:

1、走近java

2、自动内存管理机制

3、虚拟机执行子系统

4、程序编译与代码优化

5、高效并发

 

1.1、概述

java不仅仅是一门编程语言,它还是个技术规范:提供完整的软件开发和跨平台部署,广泛用于嵌入式、移动、j2ee、大型机等各种场合;java语言的主要优点:摆脱硬件束缚;提供相对安全的内存管理和访问机制,避免大部分内存泄露和指针越界问题;常用代码索引使得程序运行越久效率越高;完善接口实现。

 

Groovy [英]'ɡru:vɪ[美]ˈɡruvi    

Groovy是一种基于JVM(Java虚拟机)的开发语言,它结合了Python、Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码。由于其运行在 JVM 上的特性,Groovy 可以使用其他 Java 语言编写的库,使用方式基本与使用 Java代码的方式相同,该语言特别适合与Spring的动态语言支持一起使用,设计时充分考虑了Java集成,这使 Groovy 与 Java 代码的互操作很容易。

还有Clojure、JRuby等基于JVM的开发语言,称为广义的java语言,因为他们都是基于jvm实现的。

 

1.2、JDK、JRE、JVM的联系与区别:

        JVM 是 Java 平台的基础,和实际的机器一样,它也有自己的指令集,并且在运行时操作不同的内存区域。 JVM 通过抽象操作系统和 CPU 结构,提供了一种与平台无关的代码执行方法,与主机硬件、主机操作系统无关。但是在一些小的方面, JVM 的实现也是互不相同的,比如垃圾回收算法,线程调度算法(可能不同 OS 有不同的实现)。 

        JVM 的主要工作是解释自己的指令集(即字节码)到 CPU 的指令集或 OS 的系统调用,保护用户免被恶意程序骚扰。JVM 对上层的 Java 源文件是不关心的,它关注的只是由源文件生成的字节码文件;类文件的 组成包括 JVM 指令集,符号表以及一些补助信息。 

        JVM是解释.class文件向CPU或OS发出指令的机器。

 

        JRE是指java运行的标准环境。光有JVM还不能成class的 执行,因为在解释class的时候JVM需要调用    解释所需要的类库lib。 在JDK的安装目录中可以找到jre目录,里面有两个文件夹bin和lib,在 这里可以认为bin里的就是jvm,lib中则是jvm工 作所需要的类库,而jvm和 lib和起来就称为jre。(jre里有运行.class的java.exe、却没有javac.exe,说明JRE不能编译java文件)

PS:在运行eclipse时,任务管理器会有一个或两个javaw.exe进程,这个进程是做什么的呢?

      运行java命令时,会出现并保持一个DOS窗口,而运行javaw,不出现DOS窗口,可以将java.exe理解为jvm的启动程序。

 

       JDK是java开发的最小环境。

       在JDK的安装目录下面有 一个src类库源码压缩包和几个声明文件、以及这文件夹:bin、include、lib、 jre;

       bin:最主要的是编译器(javac.exe)

       include:java和JVM交互用的头文件

       lib:类库

       jre:java运行环境

(注意:jdk里的bin、lib文件夹和jre里的bin、lib是 不同的)总的来说JDK是用于java程序开发,而jre 只能运行.class文件而没有编译的功能。在安装java时,要安装一个jdk和一个jre目录。

       eclipse、idea等 其他IDE都有自己的编译器而不是用JDK bin目录中自带的javac.exe,所以在安装时会发现只要求jre路径。

 

三者关系图:

JDK

     ++

      |-----jre

              ++

               |-------jvm(bin)

JRE自带的基础类库主要是JRE\lib\rt.jar这个文件,包括了J2SE标准版的所有类库。  

 

java技术平台:JAVA CRAD(如手机卡) 、 JAVA ME(手机、Pad) 、 JAVA  SE(桌面级)、JAVA EE(企业级);

java.xxx.xxx的包.类为j2se的api,但也包含了少量的javax.xxx.xxx;

javax.xxx.xxx的包.类为j2ee的api;

 

1.3、java的发展史

1991  James Gosling(詹姆斯.高思林)  oak(橡树语言)----- >1995(java)    "Write once ,run anywhere"

1996  jdk 1.0   第一代纯解释虚拟机 (Sun Classic VM);javaj技术:AWT,applet;

1997  jdk 1.1   java技术:Jar、JDBC、JavaBeans、RMI、InnerClass、Reflection, 收购HotSpot(主流商用虚拟机,1.3之后采用该虚拟机作为jvm)

1998  jdk 1.2   分平台(se/ee/me)发布,基于java产生的技术:EJB、java plug-in、java IDL 、Swing ;虚拟机(Sun Classic VM、Hotspot、Exact VM);后两种基于JIT编译器(just in time 实时编译)

2000  jdk 1.3   java技术:JNDI;虚拟机全面使用HotSpot

2002  jdk 1.4   java技术正则表达式、NIO、XML解析、异常链;产品走向成熟,主流公司参与或独立实现jdk1.4 , 至今许多应用仍能在jdk1.4上运行,微软发布竞争产品.net(sun控告micro发布jdk 1.2 vm侵权,micro独立研发.net语言)  

2004  jdk 1.5   自动装箱、泛型、注解、枚举、可变参数数量、foreach语句,虚拟机:改进内存模型。版本发布由原来的jdk1.5改为jdk5,往后为jdk6,...

2006  jdk6       开始支持动态语言(查看字节码执行引擎,动态多分派),改进类加载、垃圾收集,锁与同步;公布部分源码。2009 oracle 74亿收购sun,同时收购另一家主流商用虚拟机公司JRocki

2011  jdk7       提供G1垃圾收集器, 提升动态语言支持(groovy等)

2014  jdk8

 

1.4、虚拟机的概念

所谓虚拟机,就是指一台虚拟的计算机。它的虚拟的含义,是相对于我们日常使用的真实计算机来讲的。真实的计算机我们摸得到,看得见,CPU、硬盘、内存等等,这些设备我们都可以实实在在地接触到。

 

而虚拟机,则是一种被虚拟化的技术,虚拟机中的CPU、内存等硬件设备我们都看不见,但是我们可以使用它们,可以使用虚拟机中的硬盘来存储数据,使用虚拟机中的网卡来连接网络,其实这些功能都是由程序模拟出来的,但是我们在使用过程中,并没有感觉到和真实的计算机有什么不同,这就是虚拟机技术。

 

而虚拟机技术最直接的应用,就是虚拟机软件。其最大的作用就是在一台普通计算机上模拟出另外一台乃至数台能够单独运行的操作系统,甚至还可以将这几个操作系统连成一个虚拟的局域网络。

 

虚拟机技术的几种应用

1.JAVA 虚拟机技术      JVM处于操作系统和JAVA语言之间,负责将高级语言JAVA转换成操作系统能够理解的语言;

2.虚拟机在杀毒软件中的应用      虚拟机在杀毒软件中也有着极为重要的应用,这主要表现在虚拟机脱壳上。壳是一种加密手段,病毒程序通过加壳来改变自身特征码,以躲避杀毒软件的查杀,杀毒软件都需要具有脱壳能力,其脱壳能力的好坏,直接影响着杀毒效果。目前在杀毒软件中,脱壳技术主要有两种,一种是靠程序脱壳,即针对每一种壳,都编写相应的脱壳程序,杀毒时先将加壳的程序脱壳后,再进行特征码匹配杀毒,这种方法的优点是脱壳速度很快,节省系统资源,但是当遇到新壳时,就无能为力了。因此又出现了虚拟机脱壳技术。虚拟机脱壳技术,就是在杀毒软件内部,虚拟出来一个环境,让病毒在其中运行,等病毒脱掉它的“马甲”之后,再进行特征码的匹配杀毒。

3. 商用虚拟机软件     目前,最为成功的商用虚拟机软件,无疑要数VMware 和 Virtual PC了,可以虚拟出各种主流操作系统、还可以虚拟出各种硬件、甚至可以将它们连接成一个局域网、在Windows系统中运行Linux 操作系统。只要你的内存足够大,完全可以虚拟出多个操作系统。

 

 

2.1、openjdk与jdk的联系与区别

openjdk是jdk的开放原始码版本,以GPL协议的形式放出,而JDK则采用JRL协议放出。

在JDK7开发过程中,openjdk已经成为jdk7的主干开发,sun jdk7是在openjdk7的基础上发布的,大部分原始码都相同,只有少部分原始码被替换掉。 

 

 

ps、Mercurial简明教程

 

下载安装后执行:(查看版本)

D:\Program Files\Mercurial>hg version
Mercurial Distributed SCM (version 3.1.1)

 

使用help帮助:

D:\Program Files\Mercurial>hg help init

 

建库:

比如我希望在E:/Mercuiral Library下建立一个我自己的库,只需要在E:/Mercuiral Library目录输入hg init如下:

E:\Mercuiral Library>hg init

E:\Mercuiral Library>

看不到任何输出,但是执行:E:\Mercuiral Library>dir

或者直接打开.hg目录  会发现一些文件   这时一个库建好

 

克隆:

比如我要下载openJdk的源码:

.....没找到地址...

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics