查看文章 |
java学习杂谈(十一)
2008-07-11 00:29
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虚拟机什么时候退 出呢?是在所有的非守护线程结束的那一刻,JVM就exit。注意这个时候守护线程并未退出 ,很可能还要继续完成它的本职工作之后才会结束,但虚拟机的生命周期已经提前于它结 束了。 3. JVM内部的基本概念 虚拟机内部还有一些概念,全部列举是不现实的,太繁琐也没有意义。除非您真的想自己 去做一个JVM。笔者只列举部分概念: 首先我们来看一个叫做ReturnAddress的变量,它是JVM用来存储方法出口或者说进行跳转的 依据,把任何地址存入这个变量就一定会按照这个地址来跳转。我们需要注意的就是finally 有比方法return更高的赋值给ReturnAddress的优先级。同时存在方法return和finally 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转换成int、monitorenter表示进入synchronized块加锁、getstatic和putstatic表 示对静态标量的存取、 jsr和ret等跳转指令…… 为了便于记忆,设计JVM指令集的人们约定f开头的跟float有关,d跟double有关,i跟int有关 ,s跟short有关,a跟array有关。有兴趣的可以细读文档里面的每一个指令的作用。因为只 是作为初步了解,这里就不多说了。 5. 一些Java关键字的实现原理 文档还很详细的列举了很多加载、初始化、加锁等操作的过程。笔者觉得比较有用的第一 是记住Java里面只有Array不是由ClassLoader加载的对象,其他的对象全部都必须由一个 ClassLoader来加载。另外package的概念除了类似于C 的namespace,是一种命名空间之外 ,底层的实现是规定同一个package下的类必须由同一个类加载器来加载,所以package的 概念还可以认为是被同一个类加载器加载的类。 另外在多线程中,有很多细节值得去体会。每个线程有自己的Working memory,它们从能被 共享的Main Memory中去读数据、修改、然后再存回去。笔者一直认为线程就是数据库里面 事务的前身或者说祖先。我们只要稍微比较一下它们的行为,就会发现很多一致性。事务 也是操作被事务共享的表数据,你改完我改,顺序不一致就会出现脏数据,而线程同样会 出现脏数据。我们对线程加的锁策略,同样在事务中也有适用。当然多事务的情况显然比 多线程更加复杂,但我们只要理解了多线程,相信对学习数据库事务的效果也是非常有帮 助的。Java里面除了synchronized能够帮助同步多线程之外,还有一个弱同步的操作关键字 是volatile,它产生在变量上的约束在文档中也有详细的说明。因为很复杂,考虑到篇幅笔 者就不打算解释一遍了。 好了,又是新的一篇结束了。大概再有一两篇笔者大学关于Java所学就差不多说完了。不 足之处大家尽管提出来,笔者愿意接受各种职责批评,因为笔者认为失败的教训往往比成 功更加助人成长。这个帖子一直以来得到那么多朋友的大力支持和鼓励,笔者在这里真诚 的说一声谢谢!因为笔者即将毕业投入茫茫人海去从草根阶层开始挣扎,最近冷静的想了 很多,即使毕业了,要提高的不止是技术,还包括很多综合素质,也许并不能马上找到如 意的团队和工作岗位,只能承认自己是弱势群体,有时不得不向现实的生活低头,不知道 今后是否还有这闲心去写学习笔记,去坚持走分享的道路。其实很多人我认为也很有心去 分享,但被现实的生活束缚了手脚。所以也期望还呆在学校里的大学生们好好努力的珍惜 那份无忧虑的心境和安静的环境,好好充实自己吧! |