java语言的父亲是 james gosling ,最初是应用于电视机机顶盒的语言。后来在网络应用中大放异彩,借用了爪哇岛咖啡豆的名字命名为 java。此外java语言在设计其javaee时也用了java bean这个名词,这个bean也是咖啡豆,gosling太喜欢喝咖啡了吧。

  java能够如此的流行主要是因为它有着很多的优势。

  跨平台,安全,多线程,运行时才选择执行的代码。

  •   跨平台

            因为java在设计的时候是使用了把java的.java文件编译成字节码形式的class文件之后,在安装了jre环境的任何操作系统,或者是实现了虚拟机规范的硬件系统中都能够顺利执行。这样java就能实现跨平台了。

            这也是很多人选择java不选择C的关键原因之一。

            为了实现跨平台,java语言采用了编译一次解释执行的方式,这种方式要比其他解释语言执行的要慢,还有经过sun公司不屑的努力,已经出现了jit和hot spot等技术,大大的提升了执行的速度。

  • 安全

            在网络中应用最大的问题就是安全,和有限的带宽。

            java的class文件采用了高压缩率的字节码方式,很方便在网络中传输下载。

            java提供了沙箱的机制,使得代码只能够访问有限权限内的资源,这样就保证了安全性,不过它还有个缺点,不能防止无限制的内存增长和线程增长。

            当然java本身的其他安全特性也使得java语言天生就比其他的语言更加的安全些。

            其java虚拟机是有命名空间的,不同命名空间的代码使用普通的方式不能够互相访问。

            java拥有空引用检查,数组边界检查等安全特性。

            总之java语言是十分安全的。

  • 多线程

           java语言的多线程是很方便的。只需要集成Thread类或者是实现Runnable接口就好了。

  • 动态选择执行的代码

           这个又叫做动态绑定,后绑定,java语言中除了final和static类型的方法外默认都是虚方法的,在存在虚方法,并且有继承树,父类中的方法在子类中被覆盖的情况下就会达成这种动态选择执行代码的条件,也就是我们通常见到的多态。

 

  java拥有如此多的优势,主要是由java本身的特性带来的。

  java的特性主要有:

  • java虚拟机

          主要功能:

  • 提供了一个平台的规范,只要符合这个规范都能用作java虚拟机环境,比如jre的版本就存在sun公司开发的,ibm公司开发的等多种规范,就算是硬件符合了这个规范也可以用作java虚拟机。
  • 能够读取和检查字节码,并且运行这些字节码。

 

          JVM体系结构:

  • 运行一个java程序就会产生一个虚拟机实力,对应的就是Runtime类的实例。
  • 在java虚拟机内部有两种线程,守护线程和非守护线程。守护线程通常是由虚拟机自己使用,比如执行垃圾回收的线程,当程序中所有的非守护线程都种植时,虚拟机将会推出。知道了这个我们在设计多线程程序的时候可以把一些用来提供服务的线程设置为守护线程,这样就能够在底层默默的做贡献了,比如我们在web环境中设计定时器的时候就能够使用这种线程。当然通过System类的exit方法也是能够强制突出虚拟机的。

JVM四段内存模型

JVM 的内存模型,可以分为如下几个部分:

  • Registers 寄存器,反映最快的存储,因为它的位置在处理器中,而不在内存中,所以是我们不能够直接操作的。
  • 文本段,装载过来的 class 字节码,放在这个部分。
  • 数据段 (static 静态存储 ) 。存储在整个程序运行期间都能够访问到的数据,即 static 类型的数据和类型信息。 成员变量能够自动初始化,也是因为它可以作为类型信息的一部分装载在数据段中,然后在数据段清 0 的时候进行操作。

          并且在java语言中只能是static类型的方法才能够引用其他static类型的方法也是因为当数据段中的方法存在的时候,堆中的普通方法有可能是还没有存在的。

  • 栈( stack )。可以通过栈指针进行访问。这是仅次于寄存器的最快、最有效率的分配内存的方法。但是由于这里面的信息都必须知道数据的内存空间和生命周期,灵活性受到了限制,所以 java 只把 reference ,中间结果,基本类型放在栈里,对象本身没有放在栈里。
  • 堆( heap )。所有的 java 对象都保存在这里。
  • 垃圾回收(GC)

          如何判定垃圾。java把所有的对象都放在堆中进行监视,如果一个对象没有指向其的引用那么这个对象就是garbage。

          GC是自动运行的,我们不能确定GC发生的时间,System.gc()方法只能够使虚拟机检查是否需要进行内存清理。

          finally()方法,是当对象被回收的时候一定能够调用的方法,但是并不是析构函数,我们可以通过在这个方法中写一些验证的代码查看对象被回收的时候,其属性的状态是否是我们想要的状态。

          垃圾回收的工作过程:

          垃圾回收进行的时候会重新分配内存以增高程序的运行速度。java现在的自适应垃圾回收的过程是:当频繁产生垃圾的时候根据栈中的refrence来找到活动的对象重新分配内存,然后清空其他的垃圾,因为会有大量的分配和拷贝的工作,所以比较费资源,当程序稳定之后垃圾就会变得比较少,这时候会转变为另外一种工作方式:会进行标识和清理,大的对象不变,对小的对象进行标识,然后统一压缩拷贝,清理垃圾。

  • java运行时环境

          java程序运行的通常情况是,首先使用javac把.java文件编译成字节码的形式的.class文件。程序运行时装载对应的文件,进行字节码校验,检验完成后把字节码解释为机器码进行执行。这样的效率就比较低。

          为了提高效率,出现了jit(just in time)技术。即先把一些常用的程序翻译成机器码,这样就能够执行执行,不需要重复解释了。

          HotSpot技术

          当我们配置好环境变量之后在命令行模式下使用java -version进行查看的时候就能看到Java HotSpot技术。这种技术是为了解决jit的弊端。因为jit技术会使得文件变大,内存置换变多,同样会影响效率。HotSpot技术能够根据程序运行的热点,判断有必要的代码才进行JIT,并且每次只进行少量的优化,以达到平衡,使效率最大化。

 

         总结一下:java拥有很多非常好的特性,并且使得java变得很容易使用和进行设计,我们能够使用这样一门语言进行编程实在是很幸运的事情。