- 浏览: 604884 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (300)
- Web前端 (27)
- Java疑难 (60)
- 面试 (59)
- 汇编语言 (1)
- 计算机组成原理 (2)
- 操作系统 (3)
- 计算机网络 (6)
- C/C++疑难 (9)
- SSH (2)
- Web开发 (15)
- 故障 (3)
- 软件开发 (16)
- Portal开发 (1)
- 后台开发 (6)
- 数据库 (35)
- 设计模式 (4)
- 数据结构与算法 (4)
- Linux (3)
- 项目管理 (10)
- 多线程 (12)
- 嵌入式 (9)
- 网络编程 (4)
- 架构设计 (20)
- 软件工具技巧 (7)
- 并行并发 (4)
- 窗口编程 (7)
- 串口编程 (0)
- Flex (2)
- 协议 (1)
- 通讯方式 (4)
- 性能分析优化 (5)
- 测试相关 (4)
- 海量数据处理 (2)
- JAVA核心技术 (10)
- SOA (3)
- 攻略规划 (1)
- 爬虫/搜索 (2)
- 正则表达式 (1)
- A Comparison Of NoSQL Database Management Systems And Models (1)
最新评论
-
charles751:
分析的很好!但有一点:只要同步组合操作就可以了,不一定非要sy ...
Vector 是线程安全的? -
S346618898:
core Java中有一段:Vector类对自己的所有可修改方 ...
Vector 是线程安全的? -
code_cj:
基本上明白了.但执行顺是否应该是/etc/profile -& ...
profile bashrc bash_profile之间的区别和联系 -
xd2008ck:
各自有各自的场景吧楼主不要太激进了
Vector 是线程安全的? -
zwt2001267:
写的不错,赞一个
Vector 是线程安全的?
认为Java不能写JVM是完全错误的。JNode是一个用Java写的开源操作系统,他里面的 JVM就是用Java写的。这个操作系统现在有几十兆,其中99%的代码是用java编写,其中只有一个极小的“操作系统引导程序”是用汇编写的,我们暂 时称之为booter.exe,大小为几KB。
booter.exe的作用就是将用java写的JVM编译并装入内存,简单的说就是将JVM.class编译成JVM.exe(JVM.exe也是内存中的二进制代码,并不是真实存在的文件,我暂时称之为JVM.exe),这个过程花了5秒种。
在这个操作系统中,汇编程序只能执行1秒钟。之后汇编程序就退出内存,也再也不执行了。内存中只剩下用Java写的JVM.exe。
之后所有的操作都有JVM.exe来进行,JVM.exe负责将其它的Abc.class、Def.class等等编译成Abc.exe、Def.exe......操作系统正式启动。
JNode的官方网站上有Java写的JVM的性能和SUN的JVM进行性能比较的结果,JNode中用Java写的JVM竟然能比SUN公司用C++写的JVM还快!
结果如下:
运行评测程序ArithOpt时:
JNode :20ms*
Sun J2SDK :30ms**
上面JNode中用Java写的JVM与Sun J2SDK的用C++写的JVM的比较是在Pentium4/2Ghz with 1GB of memory上比较的。
其实,无论是c++,java,vb,delphi还是perl,他们最终在cpu中执 行时都是“二进制代码”,没有本质区别,他们的差别就在于:不同的编译器编译出来的“二进制代码”的优化程度不同。用程序员直接写出的汇编由于没有进行深 入的优化,很难达到其它用java/c++/delph/vb编译器的优化程度,所以我说:手写汇编的速度达不到c++/java的速度,实质就是说: “手写汇编再编译出来的‘二进制代码’的优化程度没有用c++/java编译器编译出来的‘二进制代码’的优化程度高”。
底层用C++或汇编来写,并不是因为他们更快,而是因为他们更节省内存、操作硬件更方 便,VB是一种解释语言,它的内存占用量也很大,而且VB中直接操作内存等硬件的方法并不多,而且C++已经有许多已经成型的类库,用C++写JVM明显 比VB强。如果你“感觉”eclipse或永中慢就认定Java慢,那么大家“感觉”WindowsXP慢是不是大家就应该认定 "C++慢 "呢?。谁快谁慢,拿数据说话吧。
另外,不要因为某些java程序启动慢就认定java慢。这除了因为上面说的原因外,还因为:
C++启动较快也不全是因为C++本身的原因,许多C++写的软件所需的一些.exe和.dll在操作系统启动时就已经启动了(比如和窗口相关的一些.dll)。
.NET程序启动较快就是因为.NET的虚拟机其实在操作系统启动时就已经启动了。
而其它一些大型软件如Microsoft Word启动较快,就是因为操作系统启动时就已经启动了和Word相关的一些服务和功能。
当然对于能直接支持java bytecode的CPU,booter.exe也可以不需要,只要有个Booter.class就可以,这样,整个操作系统就100%都是java写的了。
还有,就算在不支持java bytecode的cpu上,也可以用java来写booter.exe。
原理很简单:写个Booter.java,将它编译成Booter.class,再用 Java写个“.class to .exe编译器”,将Booter.class编译成Booter.exe,这次,Booter.exe不仅存在于内存中,还可以将它写到硬盘上。这用 Java编译出来的Booter.exe所有的功能都和用汇编写的booter.exe完全一样。
从此,我们就得到了一个“100%”的纯Java操作系统。
完全可以用Delphi写一个C++编译器,再用这个编译器去编译abc.cpp的源代 码,难道编译出来的abc.exe就变成了delphi程序吗?一个二进制代码是用什么语言写成的,是由“它是由什么编译器编译出来”决定的,而不是由 “它的编译器是由什么语言写成的”决定的。
所以Java程序不是C++程序,因为无论Java的编译器是用VB、perl、C++、还是汇编写成的,只要编译编译的是Abc.java的源代码,这就是个java程序。
举个例子,有4种java编译器。一种是用VB写成的,一种是用C++写成的,一种是用Delphi写成的,一种是用Perl写成的。他们都去编译Abc.java的源代码:
VB写的java编译器将Abc.java编译成Abc.class用了0.020秒
C++写的java编译器将Abc.java编译成Abc.class用了0.001秒
Delphi写的java编译器将Abc.java编译成Abc.class用了0.002秒
Perl写的java编译器将Abc.java编译成Abc.class用了0.040秒
最后编译出来的Abc.class完全一样,那么这4个编译出来的Abc.class在同一个虚拟机上运行时的性能完全一样,难道这可以证明VB,C++,Delphi,Perl的性能完全一样吗?
再举个例子,有4种java虚拟机(JVM)。一种是用VB写成的,一种是用C++写成 的,一种是用Delphi写成的,一种是用Perl写成的。他们都去运行Abc.class的java文件。实际运行过程是这样的:JVM先把 Abc.class编译成Abc.exe(其实只是内存中的二进制指令序列,没有这个文件,为了便于理解,我给出名 Abc.exe),然后CPU运行Abc.exe。由于四种JVM(VbJVM、CppJVM,DelphiJVM、PerlJVM)编译出来的 Abc.exe完全一样,所以四种JVM在运行 Abc.exe时的性能完全一样,差距只在于:4种JVM将Abc.class编译成Abc.exe所有的“编译所花费的时间”不同。
CppJVM将Abc.class编译成Abc.exe花0.001秒, 然后Abc.exe运行花费300秒,共300.001秒
VbJVM将Abc.class编译成Abc.exe花0.010秒, 然后Abc.exe运行花费300秒,共300.010秒
DelphiJVM将Abc.class编译成Abc.exe花0.002秒, 然后Abc.exe运行花费300秒,共300.002秒
PerlJVM将Abc.class编译成Abc.exe花0.020秒, 然后Abc.exe运行花费300秒,共300.020秒
大家可以看到,虽然VbJVM编译Abc.class的速度只是CppJVM的十分之 一,但Abc.class在VbJVM和在CppJVM上运行所花的时间几乎完全一样,难道这样能证明VB和C++性能一样?当然不能!也就是 说,Java程序运行所花费的时间,与JVM是用什么写成的几乎没有关系!哪怕这个JVM是用最快的语言写的,将Abc.class编译成Abc.exe 只用了0.001秒,最终也几乎不会影响Abc.class在这个JVM上运行的时间。
最终得出结论,Java的速度与JVM是用什么语言写成的几乎没有关系。
而Java的本地代码是用Java的JIT和HotSpot编译器在程序运行时编译出来的,根本不是C++编译器编译出来的,所以java程序根本不是一个C++程序!
JIT和HotSpot编译器可以根据程序运行时的profile对本地代码进行inline等优化,C++编译器可以吗?
大家可以去jre1.5.0的安装路径中去看看:
其中的jar文件共有50.5M,由于jar文件是压缩文件,并且bytecode的代 码要比native code精简的多(前面已经说过了:一个构造方法在bytecode中只要一个指令,构造方法在C++的编译器却要11个指令。Java一个method call只要一个machine子code,但用x86相对需要4个),所以这50.5M的java程序完成的工作大约相当于200M以上的本地代码完成 的工作。
而其中的.exe和.dll共有7.7M,本地代码在java运行环境中占的比例连5%都不到。
而这仅有的5%的“C++编译器产生的本地代码”(比如AWT.dll)在java程序 运行时还要被JIT和HotSpot编译器重新编译成新的指令序列(例如:符合SSE2的指令集的指令),并根据运行时的profile来内联到其它 java编译器编译出来的native code中成为全新的NativeCode序列。
所以C++编译器编译出来java本地库的机器代码序列在java运行的时候根本看不 到,这些机器代码也被Java的JIT和HotSpot编译器重新编译并更改执行序列,这些“C++编译器编译出来的机器代码”已经变成了“Java编译 器编译出来的机器代码”。最终,在CPU中执行的所有机器语言序列全部是由Java编译器产生的,与C++编译器没有一点关系。
C++的速度是由C++编译器在程序员开发时编译出来的机器语言的优化程度决定的。
Java的速度是由Java的JIT和HotSpot编译器将java bytecode在运行时“即时”编译成针对本地CPU的优化的本地代码决定的。
比速度的实际就是在比:看C++编译器和java编译器谁能产生更优化的机器代码。
很明显,C++的编译器不如java的JIT和HotSpot编译器,因为JIT和HotSpot编译器能针对CPU指令集进行人优化、能在运行时根据使用频率对method进行内联和优化。而C++的静态编译器永远也做不到这些。
两者有着本质的不同,但是有些人用一辈子也无法理解这其中的差别,他们只能抱着一个可怜的、没有任何根据“C++比Java快”终其一生。
相关文章http://hllvm.group.iteye.com/group/topic/24754
发表评论
-
file.encoding
2015-07-23 23:43 2524参考链接 http://blog. ... -
java常用工具
2015-03-30 17:05 788jpsjstatjstackjinfojmap -
后台线程(守护线程)
2014-04-09 23:42 1420所谓的后台线程,是指在程序运行的时候在后台提供一种通用服务的 ... -
Spring配置文件xsi:schemaLocation无法解析导致启动失败的解决方案
2014-03-27 16:59 3039来源http://www.jnan.org/archives ... -
Java 内存模型
2014-01-08 10:05 695Java 内存模型 转自WIKI,自由的百科全书 跳转到 ... -
抽象类与接口选择
2013-12-06 00:20 910从设计理念层面看 abst ... -
javac和java的路径问题
2013-11-03 22:57 5748javac和java的路径问题 ... -
Java调用dll的路径问题解决
2013-10-18 00:37 2737前言:一般我们在用java写jni类库的时候,总是得把生成的 ... -
Java Ant build.xml详解
2013-07-21 23:52 9631、什么是antant是构建 ... -
Java疑难点总结
2013-06-07 02:41 11131.类加载和初始化 加载——>连接(验证-> ... -
Java 虚拟机是如何判定两个 Java 类是相同
2013-05-27 17:17 1157Java 虚拟机不仅要看类的全名是否相同,还要看加载此类的 ... -
java.lang.ClassNotFoundException和java.lang.NoClassDefFoundError的区别
2013-05-21 11:05 981这2个东西应该是java里很常见,很简单,他们都和clas ... -
深入探讨 Java 类加载器
2013-05-21 11:06 837参考 深入探讨 Java 类加载器 http://ww ... -
深入探讨 Java 类加载器
2013-05-20 15:51 814摘自http://www.ibm.com/develope ... -
深入探讨 Java 类加载器
2013-05-20 15:48 973<!--[if !mso]> <styl ... -
final变量需要显示初始化
2013-05-20 00:15 969final int f = 10;//final in ... -
try-catch-finally中return的执行情况
2013-05-18 12:04 1781public class -
Java远程通讯可选技术及原理
2013-05-13 11:13 976源自http://www.blogjava.net/Blue ... -
Java EJB、CORBA、Webservices分布式通信基本原理及特点
2013-05-13 10:19 15211. Java远程调用的特点是什么 2. Java ... -
java传参是传值还是传引用
2013-04-28 00:44 1373个人觉得java是传值,当参数类型是基本类型,复制的是值,而 ...
相关推荐
总的来说,Java 与 C/C++ 各有优势,Java 更适合跨平台、快速开发和大型企业级应用,而C/C++则更适合对性能有极高要求、需要底层控制的场合。选择使用哪种语言取决于具体项目需求和团队技能集。在实际开发中,两者也...
5. **线程与并发**:Java的线程模型基于JVM,而C/C++需要直接操作操作系统API。转换时,需要将Java的Thread类和synchronized关键字转化为pthread库或者其他多线程库。 6. **I/O和网络**:Java的I/O和网络库(如java...
- 提升执行效率。 综上所述,JVM是Java平台的核心,它不仅提供了执行字节码的能力,还通过HotSpot VM等实现了高性能的执行环境。Java语言的特性、编译器的工作流程以及Class文件的结构共同构成了完整的Java生态...
《深入理解JVM源码与调优:C/C++视角》 JVM(Java Virtual Machine)是Java程序运行的核心,它负责将字节码转换为机器码,使得Java具有跨平台的能力。本资料主要探讨JVM的源码解读以及如何进行JVM调优,同时也涉及...
JVM采用了基于栈的架构,这种方法有利于简化指令集设计,同时也有助于提高执行效率。 ##### 安全性 安全性是JVM设计的一个重要方面。JVM通过执行时验证机制确保字节码的安全性,防止恶意代码的执行。 #### 另一个...
- JNI可以用于执行计算密集型任务,如图像处理、音频处理,因为C/C++的执行效率通常高于Java。 - 但是,过度使用JNI可能导致内存泄漏和性能损失,因为Java和C/C++之间的数据转换需要额外开销。 总结,"JNI语法....
### C、C++与Java的区别 #### 一、概述 本文将对C语言、C++语言及Java语言之间的差异进行全面而详细的分析。这三种语言在IT领域占据着重要的位置,适用于不同的应用场景。对于初学者而言,理解这些语言之间的区别...
8. **编译与运行**:C++程序需要编译成可执行文件,而Java代码需要先编译成字节码,再由JVM解释执行。 9. **语法差异**:例如,Java中的方法定义没有C++中的返回类型,Java使用`this`关键字引用当前对象,而C++使用...
4. 本地方法接口和本地库:JVM允许调用非Java语言编写的方法,例如C或C++,通过本地方法接口(JNI,Java Native Interface)实现。 JVM还有垃圾回收机制,自动管理内存,避免了程序员手动释放内存的麻烦。它通过...
《虚拟机的设计和实现》是一本深入探讨虚拟机原理与实现的专业书籍,主要针对C/C++编程语言。这本书详尽地介绍了如何构建一个虚拟机,包括其内部结构、指令集设计、内存管理、垃圾回收机制以及编译器的实现等方面。...
1. **性能优化**:如果一个Java应用程序需要更高的执行效率,C++的底层控制和优化能力可能更有优势。 2. **嵌入式系统**:许多嵌入式设备可能只支持C++,而不支持Java。 3. **遗留系统集成**:在已经有大量C++代码库...
JVM通过解释器逐条解释执行字节码,也可以使用JIT编译器将热点代码编译为机器码,提高执行效率。 ### 内存管理 JVM内存分为新生代、老年代和持久代(在某些JVM实现中是元空间)。垃圾收集器通过不同的算法(如...
- 本地接口允许JVM与本地库(如C和C++库)交互。 - 运行时数据区包括程序计数器、虚拟机栈、本地方法栈、Java堆和方法区,它们分别存储线程状态、局部变量、方法调用信息、对象实例和类元数据。 5. **JVM运行时...
JNI是一个框架,它允许Java代码与其他语言(如C/C++)编写的本地代码进行交互。这主要通过定义一组API来实现,这些API使得Java虚拟机(JVM)能够加载并执行本地库中的函数。JNI的作用在于: - **性能提升**:对于...
- **提高运行效率**:Java虚拟机(JVM)对于某些特定任务可能不如原生C++代码高效,如图形渲染、数学计算或系统调用。JNI可以让Java程序调用C++代码,从而利用C++的高性能。 - **与原有C/C++代码集成**:许多现有...
4. **本地方法接口(Native Method Interface)**:允许JVM调用非Java语言编写的代码,如C或C++。 5. **本地方法库(Native Method Library)**:包含操作系统和硬件相关的实现。 二、内存模型 JVM内存主要分为以下几...
1. **运行时优化**:Java通过动态编译技术,在程序运行过程中收集运行时数据,如类型信息、对象结构、调用频率等,这些信息可以帮助Java编译器进行更精确的优化,从而提高执行效率。 2. **即时编译(JIT)**:Java...
9. **JNI(Java Native Interface)**:允许Java代码调用C/C++等本地库,实现Java与非Java代码的交互。 10. **JVM参数调优**:根据应用的特性,可以调整JVM的各项参数,如-Xms和-Xmx设置堆内存大小,-XX:+...
这一特性使得Java编写的程序能够在不同的操作系统上无缝迁移与执行,极大地简化了跨平台编程的复杂度。再者,Java提供了垃圾收集机制,通过收集器自动回收未被引用的对象,从而释放内存空间,减少了内存泄漏的风险。...
#### 十三、Java与C/C++执行效率对比 - **Java执行效率**:通过JIT编译优化,某些情况下可以接近或超过C/C++。 - **优势**:Java具备更好的移植性、内存安全性和动态特性。 #### 十四、解释器与编译器并存架构的...