Java、JIT 和垃圾收集器效率

标签 java garbage-collection performance jit

想了解Java的效率以及Java虚拟机和Android的优缺点。 效率是内存使用率低、处理器使用率低和执行速度快。

移动设备比 PC 更简单,因此应用程序需要更高效。服务器接收许多连接,它们需要非常高效。许多移动设备使用 Android 和 Java 应用程序,许多服务器使用 PHP。

Java 和解释型语言(例如 Java Script、Python 和 PHP)能否比 C 和 C++ 更高效?

JIT(准时制)优势:

  • 它可以更好地优化,因为它知道一些变量的值以及它在哪里使用或更改。
  • 它了解处理器并可以使用处理器特定指令进行优化。
  • 将函数转换为内联函数更容易。
  • 它可以删除已知的条件测试并删除不会运行的 block 。

Java 的缺点:

  • 当应用程序第一次运行时,应用程序会非常慢,因为字节码会被解释,JIT 编译器会做很多分析以找到好的优化。应用程序无法使用硬件的最大功率。如果一个应用程序是游戏或实时应用程序,如果它第一次成功运行并且没有延迟,但是它使用了最大的硬件功率,那么下次运行该应用程序时,它不会使用由于优化而产生的最大硬件功率。问题是应用程序不能设计为在优化后使用最大的硬件功率,因为​​它在第一次运行时会太慢,并且不会继续运行。
  • Java 检查数组索引是否越界,并检查指针是否不为空。它将向生成的代码添加几个内部“if”。
  • 所有对象都使用垃圾收集器,包括非常容易手动删除的对象。
  • 对象的所有实例都是使用动态内存分配创建的,包括可以轻松使用堆栈的对象。如果循环迭代开始创建一个类的实例并结束删除创建的对象,动态内存分配将是低效的。
  • 垃圾收集器在清理内存时需要停止应用程序,这对于游戏、GUI 应用程序和实时应用程序来说是非常不受欢迎的。引用计数很慢,它不能处理循环引用。多线程垃圾收集器速度较慢,需要更多使用 CPU。

最佳答案

Can Java and interpreted languages, such as Java Script, Python and PHP, be more efficient than C and C++?

很难获得比最好的 C 和 C++ 程序更高效的程序。尽管有很多 C 和 C++ 程序远没有那么高效,但如果您有任何优势,用(现代)Java 代码击败它们是非常实用的。 我也听说过有关当前同类最佳 Javascript 引擎的好消息,但我从未详细研究过它们。

对于 Python 和 PHP(以及许多其他语言),情况有点不同。这些语言是用 C 编写的,因此很明显它们不能比 C 更有效(后面是构造)。然而,在其中编写高效代码(即使用实际上编写得非常好的 C 库)比从头开始要容易得多。特别是,它减少了每个程序的缺陷数量。这在实践中是一个非常重要的指标;如果允许错误,任何人都可以快速生成代码。

一般来说,我建议不要担心获得最大效率。你违反了 yield 递减法则。相反,使用明智的整体算法(或者,正如我的一个 friend 曾经对我说的那样,“照顾大 O() 并让常量因素照顾自己”)并关注程序是否足够好这个问题在实践中。完成后,停止摆弄并发货!

关于Java、JIT 和垃圾收集器效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5607017/

相关文章:

postgresql - 为什么 PostgreSQL 性能在 VACUUM FULL 之后没有恢复到最大值?

"Beans"的 JavaBeanBooleanPropertyBuilder 没有 setter

java - <p :dialog closeable ="false"> still get closed on pressing Esc

memory-management - 垃圾回收机制是如何工作的?

c# - C# 应用退出会自动处理托管资源吗?

java - 我可以默认使用 EAGER fetchType 生成 JPA 实体吗?

java - 创建 JavaFX 可执行文件,包括 JRE 和外部库

java - 字符串实习生 API 文档

php - 重新分配数组会释放它使用的内存吗?

c# - 为什么这个 F# 代码这么慢?