jdk/bin/java和jdk/jre/bin/java之间的区别

10

本周进行了一些测试,我发现了这种情况:

当我使用jdk/jre/bin/java中的java可执行文件运行tomcat时,性能比使用jdk/bin/java运行要好得多。 问题是:有人知道为什么jdk软件包提供2个java可执行文件,它们之间的区别是什么,这可以解释性能差异吗?


3
你能分享基准测试吗?它们之间没有区别。JRE是运行时环境,仅需要运行程序而不带有额外的实用程序(例如jstack、jconsole、javah)。在JDK bin中的java.exe和JRE bin中的java.exe之间性能不应有差异。 - Abhijith Nagarajan
另外,请分享每个Java版本(java -version)。我假设您正在运行OpenJDK。文件大小有区别吗?您可能会遇到冲突的JVM。 - Daniel B. Chapman
抱歉,我没有基准测试数据...我的问题基于Tomcat启动时间,使用JDK可执行文件需要600,000毫秒才能启动,而使用JRE只需要160,000毫秒。差异非常大。版本是OpenJDK 64位服务器VM(构建24.45-b08,混合模式)。 - Thiago Lacerda
2个回答

10

我虽然来晚了,但是我来到这里是为了寻找 OpenJDK 中几种不同的 java 变体之间的差异。我只得到了一些澄清和对问题“它们之间有什么区别”的额外疑问;希望这有所帮助。

在查看 OpenJDK(我使用的是 OpenJDK 1.7.0)的基本目录时,我看到了 三个 java,它们的哈希值各不相同:

  • bin/java,二进制文件
  • jre-abrt/bin/java,二进制文件;假设 ABRT 是 自动错误报告工具
  • jre/bin/java,一个 shell 脚本,它以两种不同的方式之一 exec 执行 jre-abrt/bin/java 变体(更多内容见下文)。

上述二进制变体在我的版本和系统中具有相同的文件大小和创建时间,但两个文件之间有 4 个字节不同(我没有深入研究——这是你问题的另一部分——但它们确实不同,而且看起来不像是 ASCII 字符串,例如)。

你称脚本变体比较快,这似乎是违反直觉的,因为它似乎正在做更多的工作。(或者也许你只看到了执行脚本的时间,而没有看到 execjava 命令的时间?)该脚本检查是否存在 ABRT 共享对象文件,如果存在,则将其(作为 -agentpath...)传递给 .soabrt=on。再次说明,这似乎应该是无非是更多的工作……假设使用 ABRT。

如果你还对此话题感兴趣,也许以下内容会有趣:

  • 检查脚本中所使用的路径(检查/usr/lib64/libabrt-java-connector.so或者jre/bin/java脚本中的路径是否正确)
  • 如果直接执行第三种变体(jre-abrt/bin/java)更快
  • 在这两种情况下,还会涉及到其他什么--比如inotifystrace之类的操作,但对于这样的服务来说,这可能是一个庞大的问题。

4

java.exe文件实际上是相同的。 JDK是Java开发工具包,其中包括开发应用所需的所有java可执行文件。

JRE是Java运行时环境,包括运行Java应用所需的内容。

因此,在部署模式下运行应用程序时,您只需要JRE,因为最终用户可能只有JRE而没有JDK。


这并没有解决JDK版本为什么可能比JRE慢的问题...对于这个(真正的)问题有什么想法吗? - rolfl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接