JVM

一个Java程序,如果不了解JVM的工作原理,就很从底去把握Java言和Java程序的运作机制。里先推荐一个最威的JVM的文档,大家只要查过Java API的可以在里面的一个叫“API, Language, and Virtual Machine Document”标题下看到四个子标题,第一个是我最熟悉的Java API Specification,很少会有人注意到第三和第四个子标题,分是“The Java Language Specification”和“The Java Machine Specification”后面都有(Download)字JVM的那个URL直接接到http://java.sun.com/docs/books/vmspec/2nd-edition/里地址。我可以下到一份非常详细JVM原理的官方文档。笔者时间花了1个星期来阅读里把自己的收跟大家来分享一下,大概从这么几个方面来  

1   JVM实现机制

Java机就是一个小的算机,有自己的指令集,有自己的文件系,管理内部的表和数据,负责读class文件里面字节码,然后转换成不同操作系CPU指令,从而使得Java程序在不同的操作系利的跑起来。所以WindowJVM能把字节码转换Window的指令集,LinuxJVM能把字节码转换Linux的字,同理Solaris,它彼此之是不能通用的。最早一款的原型然是Sun公司开发的,但展到在其任何厂商都可以自己去实现一个虚机,用来取字节码转换OS指令。甚至我可以认为JVMJava言都没有系,因你自己哪怕用事本写一串字节码,也可以JVM来解析运行,只要你的字节码能通JVM验证  

JVM验证是很格的,里只一些有趣的地方。大家还记Java图标是一个杯咖啡?究其史我可以,但有更而易的方式是JVM判断一个文件是否是class文件?JVM的做法是取前4个字节转换16制数,判断是否等于0xCAFEBABE个数。注意到单词?“cafebabe”,代表着国外一咖啡品牌,似乎叫做Peet’s       coffee-baristasJava的人了方便记忆选择这样一个16制数作为标class文件的,所以任何class文件都必具有4个字部。我可以用DataInput个接口的实现类验证一下,取任何一个class文件的第一个intintJava里面是四个字转换16制一定会是0xcafebabe的。  

所以里想告大家的是,JVM并没有那神秘,我完全可以理解它的构造。  

 

2   Java的基概念  

配合JVM构,在Java言中也会有很多特点比较鲜明的地方。比如值计算从来不会检查位溢出。任何量存的二制即使位全部1了仍然可以加,全部0了仍然可以减。大家只要稍微测试一下就知道了,看几个例子:  

                int  max       =       Integer.MAX_VALUE;  

                int  min       =       Integer.MIN_VALUE;  

                max+1  == min;   //true  

                min-1 ==  max;  //true  

                0.0/0.0   //得到“NaN(Not       a       number)  

                1/0.0   //Infinity  

                -1/0.0  //-Infinity  

                1-1/0   //ArithmeticException唯一的异常情况  

看完几个例子,大家是否能更好的把握Java的数运算呢?Java完全遵照IEEE-754准来定义单双精度浮点数以及其他的数方式。  

另外Java里面有一个概念叫做Daemon Thread(守护线程),知道它的存在主要是了理解虚机的生命周期。当我运行java命令,从main函数入的那一刻起,虚机就始启运行了。Main所在的主线程也会启起来,它属于非守护线程。与之同一些守护线程也会同,最典型的守护线程代表就是GC(垃圾收集器)线程。JVM机什么时候退出呢?是在所有的非守护线束的那一刻,JVMexit。注意候守护线程并未退出,很可能继续完成它的本工作之后才会束,但虚机的生命周期已提前于它束了。  

 

3   JVM内部的基本概念  

机内部有一些概念,全部列是不现实的,太繁也没有意。除非您真的想自己去做一个JVM。笔者只列部分概念:  

首先我来看一个叫做ReturnAddress量,它是JVM用来存方法出口或者说进行跳的依据,把任何地址存入量就一定会按照个地址来跳。我需要注意的就是finally有比方法return更高的赋值给ReturnAddress。同存在方法returnfinally return,一定是按照finally里面的return准。  

JVM有自己的Heap,能被所有线程共享,存着所有的象,内存是动态被分配的。线程,有自己的Stack里面存位叫做Frame)。里面就记录着零时变量、象引用地址、方法返回等数据。JVM有一个叫做Method       Area的地方,存着一段一段的可行代一段就是一个方法体,也能被所有线程共享。所以我们说一个线程其run方法跑起来,跟它的中声明的其他方法是两个概念。因其他的方法包括的所有的象,候都充当为资源被线程使用。  

JVM有自己管理内存的方案,因它具有文件系的功能,我可以看成一个小型的数据,内部有许许多多不同的表。表的字段可能是另外一表的地址,也可以直接就是一个存数据的地址JVM所有运行的解析验证计算等管理工作,实际上都是在管理些表的变动,如果我从数据的角度来看,JVM所做的就是根据你的代来操作那多个表最后返回果的程。里面的表构包括class的表、field表、method表、attribute表等。  

 

4   JVM的指令集   

JVM有自己的指令集,笔者从前也看一些算机构和汇编语言的数,建大家也稍微看看,了解设计一个高效可用的算机指令集是多么复杂又多重要的程。JVM的指令集,职责是管理好Java程序编译出来的字节码,相而言指令集的名称就多少和Java言相了,比如指令集里就有sastore,saload表示array里面short的存和取、d2i表示从double转换intmonitorenter表示synchronizedgetstaticputstatic表示态标量的存取、jsrret等跳指令……  

了便于记忆设计JVM指令集的人们约f开头的跟floatddoubleiintsshortaarray。有趣的可以细读文档里面的一个指令的作用。因只是作了解,里就不多了。  

 

5   一些Java关键字的实现原理  

文档详细的列了很多加、初始化、加等操作的程。笔者得比有用的第一是Java里面只有Array不是由ClassLoader象,其他的象全部都必由一个ClassLoader来加。另外package的概念除了似于C++namespace,是一命名空之外,底实现定同一个package下的由同一个器来加,所以package的概念可以认为是被同一个器加  

另外在多线程中,有很多细节值得去体会。线程有自己的Working memory,它从能被共享的Main Memory中去数据、修改、然后再存回去。笔者一直认为线程就是数据里面事的前身或者祖先。我只要稍微比一下它的行,就会发现很多一致性。事也是操作被事共享的表数据,你改完我改,序不一致就会出现脏数据,而线程同会出现脏数据。我们对线程加的策略,同在事中也有适用。当然多事的情况然比多线程更加复杂,但我只要理解了多线程,相信数据的效果也是非常有帮助的。Java里面除了synchronized帮助同线程之外,有一个弱同的操作关键字是volatile,它生在量上的束在文档中也有详细明。因复杂,考到篇幅笔者就不打算解一遍了。

你可能感兴趣的:(jvm,linux,Solaris,OS,sun)