怎么写jvm( 三 )


4.一段小程序有几种写法,如何评价JVM对其的执行效率在Java层面讨论这种粒度的细节可能不太合适 。
Oracle JDK8 / OpenJDK8里的HotSpot VM里,当被HotSpot Server
Compiler(C2)编译过后,Math.addExact()的overflow检查是用硬件自带的指令完成的,开销极低,比各种显式用运算的方式检查都快多了 。
例如在x86上,Math.addExact(int, int)int会被编译为类似:
X86代码
add eax, edx # 普通的32位整数加法
jo throw_ArithmeticException # overflow的话跳到抛异常的逻辑
因为x86上加法指令都会设置EFLAGS/RFLAGS里的OF(overflow flag),要检测有没有overflow只要在后面用jo(jump if overflow)就好了 。其它CPU也是类似,很少CPU是没有这种功能的…
这么一来,在没有overflow的时候无论写什么形式的Java代码都不如直接调用Math.addExact()快;在有overflow的时候则不同,因为Java
8
API的设计还是太煞笔,只提供了抛异常的版本而没提供别的方式返回是否overflow的版本的API,所以如果经常overflow的话用Math.addExact()未必快,要看情况 。
5.jvm有什么用java是面向对象编程,一切皆对象 。这个观念要以后慢慢才能了解,无论怎么样讲都是初学者理解不了的 。所以还需要多多练习 。
C语言是面向过程编程的 。所以没有“类”的概念,而java的类却更符合人类的思维方式,C语言更符合机器的思维方式 。
还有就是,千万不要把C语言的一些概念和java混淆,这是两种不同类型的语言,java是纯的面向对像的编程语言,而C是面向过程的 。以后的学习中你会发现java比C更有优势 。再重申一下,最好不要把C的概念和java做对比 。你把java当作一门新的语言来学 。唯一可以借鉴C的就是语法和编程的一些基本概念如数据类型,设计模式之类的 。
jvm 是java虚拟机,将java的class字节码文件翻译成二进制可执行程序 。
jdk 是java的开发包 java sdk, java的开发工具,包含SUN公司提供的java API,将java源码编译为class字节码文件,通常jdk中就包含了jre 。
jre 是java运行时,用于执行java程序 。
jse 是java标准开发,jse 就是java开发的一种,标准开发,例如开发桌面程序 。
其余的还有 javaEE, javaMe 前者是java的企业应用,后者是java的嵌入式开发,例如java手机程序 。
如果netbeans能运行,说明你安装的netbeans已经包含了JDK,而jdk里已经包含了jre和jvm,故以后就可以省心了,至于环境变量的事情,你可以去搜索一下,很简单的配置,有个好消息告诉你,如果你是按照安装向导操作的,向导会自动将环境变量写进去 。
java基础类库就是API,而你说的“库”我不太明白是什么意思 。
jdk是开发工具包,里面包含 javaSE, JRE, JVM
jdk 把.java文件编译成为.class字节码文件
然后JRE调用JVM将字节码文件翻译成可供机器执行的程序 。就这样了啊 。
最后说一句: 不推荐使用Netbeans, 现在公司里都用Eclipse,这才是趋势 。
************************************8
继续补充
angelicdemon 所说的没错,IDE环境会在配置文件里自己写上jdk和jre的路径以便找到他们 。
但是经过安装向导安装jdk后确实会自动将java所需要的环境变量写进系统环境变量中 。再有,如果使用IDE的话 环境变量没啥用处,只有用命令行模式编译java源码才会有用处 。
另外: Eclipse绝对是现在公司的首选,因为公司里的项目用ECLIPSE构建的,源码上传到版本控制系统后,同步后,你用Netbeans打不开,还得重新构建,麻烦吗? 再说了NB和EC还是有相当大区别的 。
还有就是,这句话最重要,如果你真的是java初学者,绝对不要用IDE,用记事本+命令行 这样才能真正掌握java的机理 。哈哈 累死我了,就写到这吧