当前位置: 首页 > 知识库问答 >
问题:

为什么java只允许动态链接?

经和洽
2023-03-14

我在YouTube上跟随编译器教程视频,当我遇到这样一个事实,即C编程语言更快,因为它允许静态链接和动态链接,但Java只允许动态链接,这就是为什么C比Java快得多。

我的问题是,如果静态链接使程序运行得更快,为什么它不包括在Java中?我知道Java的开发人员做出不包括静态链接的决定肯定有一些真正的好理由,我只是想知道原因是什么。

注意:我不知道这个问题是否已经在SO上有答案,但是因为我找不到答案,所以我发了帖子。如果答案已经存在,请提供一个链接。

注意:提供的教程链接是印地语的。很抱歉。

共有3个答案

暨嘉
2023-03-14

因为静态链接和动态链接的关系,C不会更快。这是转移注意力。

Java加载时间通常很差,因为VM和标准库相对较大,这意味着要加载的内容很多。

事实上,动态链接可以用来加快初始加载时间,因为使用dlopens()和您控制的朋友,加载何时发生,而不是预先支付成本(在加载期间)。

在这种情况下,一般来说,性能上的一个主要差异在于记忆,尤其是在C语言中,在一定程度上控制内存布局的能力。这可以产生巨大的好处,因为通过减少碎片,并将事情减少到“缓存大小”,CPU缓存和推测性硬件优化(如预取)工作得更好。

慕容品
2023-03-14

Java中的静态链接会迫使编译器在每个应用程序中添加整个JRE库,这将是一种内存浪费,并且会破坏Java的编译一次/随处运行优势。

董宜然
2023-03-14

Java在编译时不包含链接器步骤。在Java9中,将有一个工具(jlink:JEP 275,JavaOne Talk on Project Jigsaw),它将创建一个将依赖项链接在一起的映像。

Java创建时的主要目标之一是“代码一次,到处运行”,静态链接环境依赖的库或代码部分将否定这一特性。

 类似资料:
  • 问题内容: 为什么无法覆盖静态方法? 如果可能,请使用示例。 问题答案: 覆盖取决于拥有类的实例。多态性的重点是可以对一个类进行子类化,并且实现那些子类的对象对于在超类中定义的相同方法(在子类中被重写)将具有不同的行为。静态方法未与类的任何实例相关联,因此该概念不适用。 影响Java设计的因素有两个。一个是对性能的关注:Smalltalk批评它太慢(垃圾回收和多态调用是其中的一部分),Java的创

  • 问题内容: 我读了这个问题,并认为如果可以写的话,很容易解决(不是没有它就不能解决): 我不确定在很多情况下它是否有用,但是我想知道为什么它没有用,以及其他语言中是否存在类似的东西。 你们有什么感想? 编辑: 澄清一下:是的,我知道,这在Java中是不可能的,我也不是很想念它。这不是我期望的工作,并且惊讶于出现编译器错误。我只是有这个主意,喜欢讨论它。 问题答案: 它违反了封装。你不应该能够绕过父

  • 为什么Java只允许main方法采用形式的参数?即字符串数组 为什么Java不允许int或double数组 或 为什么它不允许单个字符串或int或float而不是字符串数组呢?类似于: 或

  • 问题内容: 我想知道Java中是否有特殊原因总是使用“ ”而不是“ ”来定义类型参数的界限。 例: 被禁止但是 是正确的。是什么原因呢? 问题答案: 在类“实现”还是“扩展”之间,通用约束语言没有语义差异。约束可能性是“扩展”和“超级”-也就是说,该类是可分配给其他类的对象(扩展),还是该类可从该类分配(超级)。

  • 问题内容: Java中的数组的长度是固定的。Java为什么要允许大小为0的数组呢? 问题答案: 它表示它为空。即您可以遍历它,就好像它有项目并且没有结果发生一样: 从而避免了检查的需要。如果所讨论的数组为,则会发生异常,但是在这种情况下,它什么也不做,这可能是适当的。

  • 在信号量(java.util.concurrent.Semaphore)初始化期间,我没有得到负许可背后的基本原理。 我知道调用release()方法最终可能会使信号量的许可证大于等于1( 然而,我没有得到任何实际的用例,在这种情况下,我将使用负许可初始化信号量。 参考样本代码: