使Java VM运行绝对需要哪些类?

时间:2010-11-07 23:39:10

标签: java class language-agnostic jvm

Java VM能够启动的最小类子集是什么?

我想绝对需要像Object,String和primitves这样的东西,因为它们在VM的许多部分都是硬连接的。

我对JVM和JDK之间的依赖关系有多大感兴趣。

我想知道的基本问题是:

  

如果我决定分发JVM   使用不同的编程语言   和不同的标准库,如何   我有很多“Java”课程   随身携带让JVM满意吗?

4 个答案:

答案 0 :(得分:3)

找出答案的最佳方法是尝试并看到;例如使用java -verbose.以各种JVM托管语言运行最小程序。

但答案很可能是:

  • 特定于JVM版本,
  • 特定于编程语言。

我还应该指出,你得到的答案将没有任何实际用途(......除非你计划创建一个减少的JRE。如果是这样的话,请阅读下面的跟进。)

  

您是否知道所有类是否都是严格必要的,或者VM是否还预加载了应用程序在所有情况下都要使用的类?

JVM不会在此基础上预加载任何内容。相反,它加载了代码静态依赖的依赖关系。根据应用程序使用的类,这可能会导致加载的类实际上未使用。多年来,太阳工程师已经做了很多工作来尝试减少这种影响,但无疑在某种程度上仍然会发生。

关注

在行之间阅读,似乎意图是创建一个简化的JVM包来支持其他语言的运行时要求。如果是这样,请考虑以下几点:

  • 对于使用Java vis-a-vis 创建缩减版本,您可以采取哪些许可要求。具体来说,Java,JVM和JRE是商标用语,如果您在缩减JRE的上下文中使用它们,Oracle 可以跟随您。 (我不是说你不能这样做,但你需要自己检查法律方面。)

  • 肯定有支持问题。例如,您需要跟踪任何相关的Java / JVM安全问题和补丁,并根据需要创建基础平台的新版本。

  • 如果您打算以新语言为应用程序提供任何方式来调用Java库,那么对于某些用户来说,使用简化的JRE可能会让您感到非常痛苦。特别是如果你打包你的东西意味着他们必须使用你的减少的JRE。

  • JRE / JDK中的工具可能对您/您的用户有用。分析器,调试器,JAR命令等工具。您的JRE需要包含运行它们所需的所有类。

最后,100Mb下载对于VAST MAJORITY用户来说不是一个重要问题。如果是这样,您可以通过销售安装DVD来赚取一些钱来支持您的项目。

专注于你在这里真正想要做的事情......并且当你有一些生产质量要优化时,请将安装程序优化。

答案 1 :(得分:1)

如果您运行命令:

java -verbose

它将显示它加载的每个类以启动VM。如果在启动java程序时添加-verbose,您将获得该程序需要启动的完整列表。但这不包括它可能需要的任何其他类,因为它的工作。

为什么你需要知道需要哪些课程?

答案 2 :(得分:0)

您正在尝试拆分7000类应用程序,以查看哪些是必不可少的。如果你这样做了,你无法保证JVM在未来的某个随机点不会失败吗?更糟糕的是,如果因任何原因引起爆炸,手指可能会先指向你,直到你能证明它与删除课程无关。

如果您使用移动设备并需要节省容量,我建议您使用JME。但是,如果您使用的桌面200 MB的成本低于一分钱,那真的值得冒这个风险吗?如果它爆炸将花费你超过一分钱,我怀疑它会。

打个比方,你沿着一条主要道路行走,你会看到另一边可能是一分钱。你是通过繁忙的交通来过马路吗?我建议你继续走路。

编辑:如果你想要一个缩减版的Java,你可以试试嵌入式版本。 http://www.oracle.com/technetwork/java/embedded/downloads/index.html

它有32 MB和70 MB的种类。

答案 3 :(得分:0)

IANAL,但如果您删除java.*类,则可能会被Oracle起诉,因为Sun / Oracle的JDK专利公开专利授权要求您实现完整的java.*接口,并且你这样做符合标准。 (我认为这是Google诉讼所依赖的一部分。)

除此之外,我认为Project Jigsaw developers有一个非平凡的时间来决定什么属于基础JDK安装,以及属于模块的内容。我记得读过一篇博文(现在找不到)关于在模块(XML,IIRC)和基础安装之间打破循环依赖性的一些问题。