Java程序效率与不同的操作系统

时间:2012-01-26 14:46:52

标签: java operating-system jvm

我最近发现了一个与Java相关的问题(解释):

  1. Java应用程序在操作系统A上以合理的速度运行的原因是什么,但在操作系统B上运行缓慢?

  2. 程序员可以做些什么来纠正这个问题?

  3. 我的回答是(我知道我错了,但我会解释我的思考过程)

    (1)应用程序应该在具有JVM的任何操作系统上以大致相同的速度运行,因为应用程序在虚拟机内运行。只要VM设计正确就没关系。

    (2).. UHH

    我的问题是:这个问题的正确答案是什么?

2 个答案:

答案 0 :(得分:9)

一切都与实施有关。

问题在于JVM本身就是一个在主机操作系统上本机运行的程序,负责实现符合语言和库规范的Java库。此实现需要管理系统资源(例如文件,线程,套接字等),并且每个操作系统可能都有自己关于这些资源管理的“最佳实践”,这可能不一定与各种Java规范的设计一致。 。此外,操作系统本身实现了与这些系统资源的接口,其实现可能不像其他操作系统那样强大。

例如,多年前,Linux线程实现的性能远远低于类似UNIX操作系统(例如Solaris,AIX等)上的相同POSIX线程API。因此,在Linux机器上运行的JVM将具有与Solaris机器上相同的功能,但Linux JVM将受到该操作系统上(当时)不太优秀的线程实现的阻碍。

答案 1 :(得分:0)

这是“一段字符串有多长”的问题 - 也就是说,OS B与OS A的行为有很多不同的原因。

你也不正确(1)。

例如,在我教授的性能调优课程中,我有一个例子,一个相对简单的例子(相当容易理解和推理)在Linux上以大约1.0的速度运行,在Mac上运行1.2,在2.1上运行Windows和1.5 for Linux在Mac上虚拟化。

也有病理病例。例如,Lego mindstorms有(或者是)JVM实现。它们不执行GC,因此您基本上可以构造行为非常严重的示例。

您甚至不必去不同的操作系统就能看到奇怪的性能影响。我已经看到UAT系统与生产相同的例子,除了PROD的内核和SSD而不是HDD的数量是原来的两倍。

团队已经推断PROD的表现会更好(或者,最坏的情况下,不低于)UAT的表现。毕竟,PROD中的套件更好,所以没有任何问题,对吗?

PROD的表现实际上更糟糕。额外的内核和SSD导致应用程序由I / O占主导地位,因为SSD比HDD更快。这导致吞吐量崩溃。

用于诊断操作系统之间性能差异的一般方法相对简单:

  1. 不要假设您知道问题所在。将此视为您试图解决的“未知未知”问题。
  2. 听听系统告诉你的内容。阅读其基本的重要统计数据 - 内存消耗,分页活动,内存页面错误,线程可运行队列的大小,JVM GC活动(并确保为您的进程启用了所有正确的开关)
  3. 默认情况下,请勿触及分析器或任何其他工具。首先阅读并分析系统统计信息。如果您的系统挂在I / O上,那么在某些操作系统上,分析器可能会给您完全错误的结果,除非您真的知道自己在做什么。
  4. 一旦你认为你已经确定了问题(是I / O,CPU饥饿,GC,程序代码还是别的什么),试着测试你的理论。
  5. 如果你是对的,那就找到一个细粒度的专用工具(所以GC的GC日志分析器,如果你怀疑它的应用程序代码,可以是分析器)。
  6. 这应该可以让你快速找到问题。