【发布时间】:2011-04-09 18:37:53
【问题描述】:
我想了解Java的效率以及Java虚拟机和Android的优缺点。 效率就是内存占用少,处理器占用少,执行速度快。
移动设备比 PC 更简单,因此应用程序需要更高效。服务器接收许多连接,它们需要非常高效。许多移动设备使用 Android 和 Java 应用程序,许多服务器使用 PHP。
Java 和解释型语言(如 Java Script、Python 和 PHP)能否比 C 和 C++ 更高效?
JIT(即时)优势:
- 它可以更好地优化,因为它知道某些变量的值以及在哪里使用或更改。
- 它了解处理器并可以使用处理器特定指令进行优化。
- 将函数转换为内联函数更容易。
- 它可以删除已知的条件测试并删除不会运行的块。
Java 的缺点:
- 当应用程序第一次运行时,应用程序会很慢,因为字节码会被解释,JIT 编译器会做很多分析以找到好的优化。应用程序无法使用最大的硬件功率。如果一个应用程序是游戏或实时应用程序,如果它第一次运行成功并且没有延迟,但它使用了最大的硬件功率,那么下次运行该应用程序时,它不会使用由于优化,最大的硬件功率。问题是优化后的应用程序无法设计为使用最大的硬件功率,因为它在第一次运行时会太慢,并且不会继续运行。
- Java 检查数组索引是否超出范围,并检查指针是否不为空。它会在生成的代码中添加几个内部“if”。
- 所有对象都使用垃圾回收器,包括非常容易手动删除的对象。
- 所有对象实例都是通过动态内存分配创建的,包括可以轻松使用堆栈的对象。如果循环迭代开始创建类的实例并结束删除创建的对象,动态内存分配将效率低下。
- 垃圾收集器需要在清理内存时停止应用程序,这对于游戏、GUI 应用程序和实时应用程序来说是非常不受欢迎的。引用计数很慢,它不能处理循环引用。多线程垃圾收集器速度较慢,需要更多的 CPU 使用。
【问题讨论】:
-
我不是这方面的专家,所以我只是发表评论而不是回复,但 1) Dalvik 并不是真正的 JVM,它介于 JVM 和 Google 自定义 VM 之间 2) 所有优化是特定于 JVM 的; Sun/Oracle 的 HotSpot 非常擅长空值检查终止,它基本上可以消除(hah!)你提到的那些缺点之一 3)你对所有可用于 Java 的 GC:s 做了很多假设点,它们中的大多数(如果不是全部)并不适用于所有 JVM GC:s。
-
跟进空检查,它们可以通过以下单个指令实现:
cmp [eax], eax。对于非空对象的情况,该指令在现代处理器上几乎所有情况下都不会导致延迟。如果指针为空,则运行时可以处理 seg 错误以引发适当的异常。
标签: java garbage-collection performance jit