【话题讨论】Java虚拟机规范相关话题讨论(获奖名单已公布-2014-1-14)
获奖名单已公布,详情请看:http://bbs.chinaunix.net/thread-4119142-1-1.htmlJava虚拟机(JVM)一种用于计算机设备的规范,可用不同的方式(软件或硬件)加以实现。编译虚拟机的指令集与编译微处理器的指令集非常类似。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。Java虚拟机(JVM)是可运行Java代码的假想计算机。只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行。Java虚拟机是一个想象中的机器,在实际的计算机上通过软件模拟来实现。Java虚拟机有自己想象中的硬件,如处理器、堆栈、寄存器等,还具有相应的指令系统。
今天我们就来讨论一些相关的问题:
1、Java instanceof 关键字是如何实现的?
2、如何让JVM快速释放对象的内存?
3、为什么很多语言选择在JVM上实现?JVM在跨平台上有哪些优势?
讨论时间:2013.12.16--2013.1.3
讨论奖励:活动结束后将会抽取5-10名会员赠送《Java虚拟机规范(Java SE 7版)》一本。
内容简介:
《Java虚拟机规范(Java SE 7版)》完整而准确地阐述了Java虚拟机各方面的细节,围绕Java虚拟机整体架构、编译器、class文件格式、加载、链接与初始化、指令集等核心主题对Java虚拟机进行全面而深入的分析,深刻揭示Java虚拟机的工作原理。同时,基于最新Java SE 7平台,它详细介绍了Java SE 7中新加入的InvokeDynamic指令和方法句柄机制,给出了在Java SE 6期间引入的类型检查检验器的原理证明。还介绍了Java SE 5中对class文件格式的扩展变动,例如泛型和注解等。另外还介绍了Java内存模型的指令操作和初始化规则。
要点:
·阐释Java虚拟机与Java的关系和发展历程。
·概览Java虚拟机整体架构、包括class文件格式、数据类型、原始类型、引用类型、运行时数据区、栈帧、浮点算法、异常等。
·详述如何将以Java语言编写的程序转换为Java虚拟机指令集、涉及常量、局部变量、控制结构、算术运算、参数接收、方法调用、数组、操作数栈异常处理、同步与注解等。
·深入分析用来表示编译后的类和接口的class文件格式,主要包括ClassFile结构、描述符与签名、常量池、字段、方法、属性、代码约束与class文件校验等。
·定义Java虚拟机启动以及类和的加载、链接和初始化过程。
·阐释并列举Java虚拟机指令集。
购书链接:http://item.jd.com/11365561.html
作者简介:
Tim Lindholm,资深Java虚拟机高级架构师,Java编程语言的主要贡献者之一,Sun公司杰出工程师,目前主要负责移动设备上的Java应用。在到Sun公司工作之前,他已经在美国阿贡国家实验室和Quintus公司从事与虚拟机和运行时系统相关的工作。
Frank Yellin,Sun公司高级工程师,Java项目元老级成员。最近十余年中,他都从事解释型及编译型语言的运行时系统方面的工作。在到Sun公司工作之前,他在Lucid公司从事Common Lisp编译器相关的工作。
Gilad Bracha,Newspeak编程语言的创建者,Sun公司杰出工程师。在到Sun公司工作之前,他在Animorphic Smalltalk System公司从事Strongtalk语言相关的工作。
Alex Buckley,Oracle公司Java编程语言和Java虚拟机规范负责人。 本帖最后由 2009532140 于 2013-12-16 10:39 编辑
好书!
经常写JAVA 代码,但从来没深入研究~
直接看原文文档吧:
Operation
Determine if object is of given type
Format
instanceof
indexbyte1
indexbyte2
Forms
instanceof = 193 (0xc1)
Operand Stack
..., objectref →
..., result
Description
The objectref, which must be of type reference, is popped from the operand stack. The unsigned indexbyte1 and indexbyte2 are used to construct an index into the run-time constant pool of the current class (§2.6), where the value of the index is (indexbyte1 << 8) | indexbyte2. The run-time constant pool item at the index must be a symbolic reference to a class, array, or interface type.
If objectref is null, the instanceof instruction pushes an int result of 0 as an int on the operand stack.
Otherwise, the named class, array, or interface type is resolved (§5.4.3.1). If objectref is an instance of the resolved class or array or implements the resolved interface, the instanceof instruction pushes an int result of 1 as an int on the operand stack; otherwise, it pushes an int result of 0.
The following rules are used to determine whether an objectref that is not null is an instance of the resolved type: If S is the class of the object referred to by objectref and T is the resolved class, array, or interface type, instanceof determines whether objectref is an instance of T as follows:
If S is an ordinary (nonarray) class, then:
If T is a class type, then S must be the same class as T, or S must be a subclass of T;
If T is an interface type, then S must implement interface T.
If S is an interface type, then:
If T is a class type, then T must be Object.
If T is an interface type, then T must be the same interface as S or a superinterface of S.
If S is a class representing the array type SC[], that is, an array of components of type SC, then:
If T is a class type, then T must be Object.
If T is an interface type, then T must be one of the interfaces implemented by arrays (JLS §4.10.3).
If T is an array type TC[], that is, an array of components of type TC, then one of the following must be true:
TC and SC are the same primitive type.
TC and SC are reference types, and type SC can be cast to TC by these run-time rules.
Linking Exceptions
During resolution of the symbolic reference to the class, array, or interface type, any of the exceptions documented in §5.4.3.1 can be thrown.
【from:http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.instanceof】 这个java除了跨平台,木什么有点吧 这个java除了跨平台,木什么有点吧 action08 发表于 2013-12-16 10:12 static/image/common/back.gif
这个java除了跨平台,木什么有点吧
JAVA的优点太多了!木有JAVA能有互联网这么繁荣的今天?你知道世界上有多少WEB网站后台都是基于JAVA架构的吗?远的不说,强大的电商阿里巴巴,就是JAVA的受益者啊!而且,你知道JAVA在移动开发领域也占很大的份额吗?Android就是活的代表啊~ 本帖最后由 hbsycw 于 2013-12-24 12:22 编辑
好话题,积极参与讨论~
1、Java instanceof 关键字是如何实现的?
答:instanceof 是Java保留关键字,准确的说一个二元操作符(运算符),和==,>,<是同一类东西。它的作用是用来在运行时指出对象是否是特定类的一个实例。
instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。
用法:
result = object instanceof class
参数:
Result:布尔类型。
Object:必选项。任意对象表达式。
Class:必选项。任意已定义的对象类。
因为Java是强类型静态语言,因此,instanceof 的部分实现是在Java编译器在编译时进行类型匹配检查。运行时,如果 object 是 class 的一个实例,则 instanceof 运算符返回 true。如果 object 不是指定类的一个实例,或者 object 是 null,则返回 false。
(备注:因为OO语言的多态性机制,在实际编程中,instanceof的用处并不大,现在只是一个保留关键字,不知道为何CU要讨论这个的实现? )
2、如何让JVM快速释放对象的内存?
答:Java语言的一大特点,就是虚拟机(JVM)实现。“Write once,run anywhere”,是Java刚推出时一个很响亮的口号,这一切的基础都是建立在JVM之上。我们知道,内存是程序运行中的重要资源,内存总是有限的,对它的分配和释放进行管理是一项非常重要的工作。和C\C++这类显示内存管理(内存管理由开发人员负责)的编程语言相比,Java实现了自动内存管理,也就是GC(Garbage collector),垃圾回收器组件来负责内存的分配和回收。JVM中的GC是运行在一个独立的线程中的,它会根据当前虚拟机中内存的的使用状况,决定什么时候进行垃圾回收,也就是内存释放。GC启动的运行时间和频率无法事先预计,这取决于实现算法和当前程序运作状态。也就是说Java程序本身与垃圾回收器能够进行的直接交互比较有限。但,如何让JVM快速释放对象呢?
可以通过几种好的编程实践来实现:a 不再使用的对象显示赋空,例:obj=null; b 在程序中可以添加System.gc()方法来建议垃圾回收器立即进行回收工作,但,注意,这只是建议,垃圾回收器可以选择不执行;c 可以分析程序中对象的不同生命周期,在生成对象时,对对象进行不同引用,分别是软引用、弱引用和幽灵引用。这些引用可以在不同程序上影响垃圾回收器对被引用对象的处理,从而使JVM快速释放对象的内存。
3、为什么很多语言选择在JVM上实现?JVM在跨平台上有哪些优势?
答:就我知道的,像Scala、Groovy、JRuby、Jython等很多新的编程语言,都是在Java JVM上实现的。其实,任何编程语言,只要能生成符合JAVA字节代码规范的字节码,就都可以在JVM上运行。原因吗?我觉得,主要还是Java的跨平台性。不同平台Java虚拟机的实现,屏蔽了底层操作系统的细节(这应该是个很大的工作量吧~),提供了统一的运行平台。
各种设备、系统发展的越来越多,跨平台非常重要啊。 这个活动太好了,可惜俺不写代码,不能班门弄斧了。希望各路大牛积极发言啊。java的应用越来越广泛了。 路过,支持!!! 1、Java instanceof 关键字是如何实现的?
instanceof关键字用于判断一个引用类型变量所指向的对象是否是一个类或接口、抽象类、父类的实例。
instanceof关键字实现过程大致如下:
1)Java编译器在识别到instanceof关键字时,会对应到TOKEN.INSTANCEOF标识类型。
2)Java编译器的语法检查机制会检查instanceof语句是否正确。
3)Java编译器的抽象语法树AST包含了JCTree.JCInstanceOf类,它负责解析instanceof关键字所在的语句。
4)Java编译器为JCTree.JCInstanceOf节点生成instanceof相关的字节码。
2、如何让JVM快速释放对象的内存?
可以使用语句System.gc();建议Java虚拟机JVM调用垃圾收集器GC。
一般来说,JVM的垃圾回收器是自动回收内存的,不需要程序员操心这个。
3、为什么很多语言选择在JVM上实现?JVM在跨平台上有哪些优势?
确实如此,很多语言包括Python、Ruby、Scala、Groovy。Clojure等都有支持JVM的实现。我觉得主要有以下的原因:
1)利用JVM,可以很轻松地实现跨平台特性。
2)可以充分利用JVM的JIT即时编译的优异性能。
3)利用JVM,省去了内存管理的烦恼。
4)JVM支持多种操作系统,而且技术本身非常成熟,省去了技术成熟所需的开发时间。
5)Java语言是全球排名前三的编程语言,可以充分借用Java社区的力量。
上面的要点也可以回答JVM在跨平台上有哪些优势。