我最近发现了一个与Java相关的问题(解释):
Java应用程序在操作系统A上以合理的速度运行的原因是什么,但在操作系统B上运行缓慢?
程序员可以做些什么来纠正这个问题?
我的回答是(我知道我错了,但我会解释我的思考过程)
(1)应用程序应该在具有JVM的任何操作系统上以大致相同的速度运行,因为应用程序在虚拟机内运行。只要VM设计正确就没关系。
(2).. UHH
我的问题是:这个问题的正确答案是什么?
答案 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更快。这导致吞吐量崩溃。
用于诊断操作系统之间性能差异的一般方法相对简单:
这应该可以让你快速找到问题。