JAR文件,它们不是只是膨胀和减慢Java的速度吗?

2022-09-01 18:17:35

好吧,这个问题可能看起来很愚蠢,但我还是要问它。

在努力启动并运行Spring + BlazeDS项目几个小时后,我发现由于没有包含Spring等的正确依赖项,我的项目遇到了问题。我的 WEB-INF/lib 文件夹中缺少 .jar,是的,愚蠢的我。

过了一会儿,我设法将所有.jar文件都放在了它们所属的位置,并且达到了惊人的12.5MB,并且有超过30个!这让我感到担忧,但它可能是,希望不应该被关注。

Java如何操作这些JAR文件,考虑到它是压缩和编译的源代码,它们确实占用了相当多的硬盘空间。因此,这可以立即快速填充大量RAM。

我的问题是:

例如,当实例化.jar中的类时,Java是否会将整个.jar文件加载到内存中?.jar中从未被使用过的东西呢?

.jars 是否会以某种方式进行缓存,以优化应用程序性能?

当加载单个.jar时,我理解该事物位于内存中,并且可以在多个HTTP请求中使用(即在运行的服务器实例的生命周期内),与PHP不同,PHP是随着每个请求动态创建对象的,这个假设是否正确?

在使用Spring时,我想,我必须包括所有这些繁琐的.jar,我使用原生Java不是更好,至少像Hibernate这样的ORM解决方案吗?

到目前为止,Spring只是花费了额外的时间来配置,额外的硬盘空间,额外的内存,CPU消耗,所以我担心框架会花费太多的应用程序性能来获得例如,使用我的BlazeDS服务器实现的IoC。

仍然必须有ORM,一个单元测试框架和零碎的东西。快速且不负责任地使项目膨胀非常容易。

我在哪里画线?


答案 1

“Java是否会将整个.jar文件加载到内存中,例如,当该.jar中的类被实例化时?.jar中从未被使用过的东西呢?

不可以,类装入器会根据需要装入每个.class文件。

“.jars 是否会以某种方式进行缓存,以优化应用程序性能?”

JAR 就像 DLL 一样(除了有关链接与类加载的详细信息):它们只是.class文件的压缩库。它们不会被缓存:.class文件会根据需要加载到perm空间中。

“当加载单个.jar时,我知道这个东西位于内存中,并且可以在多个HTTP请求中使用(即在运行的服务器实例的生命周期内),与PHP不同,PHP是随着每个请求动态创建对象的,这个假设是否正确?”

当您的应用服务器将.class加载到烫发空间中时,只要服务器启动并运行,它就可用。

“在使用Spring时,我在想,我必须包括所有这些繁琐的.jar,难道我只使用原生Java,至少像Hibernate这样的ORM解决方案会更好吗?”

如果你认为使用Spring可以买到一些东西,那就不行了。如果您认为成本/收益分析对您不利,那么一定不要使用Spring。但是,如果依赖关系阻止了你,这听起来并不像你在做一个很好的分析。

“到目前为止,Spring只是花费了额外的时间来配置,额外的硬盘空间,额外的内存,CPU消耗,所以我担心框架会花费太多的应用程序性能,例如,使用我的BlazeDS服务器实现IoC。

您不知道使用Spring的性能损失是什么。如果您认为这是一个问题,请对其进行测量。我敢打赌,你的应用程序代码或数据库模式将是最大的问题。

“仍然必须有ORM,一个单元测试框架,以及这里和那里的零碎东西。快速、不负责任地使项目膨胀非常容易。

为什么要不负责任?

“我在哪里画线?”

无论如何,写你自己的。从头开始完成所有操作。您将更好地了解框架为您购买的内容以及完成后的实际成本。

我要补充一点:Spring的人写了一些最好的代码。比你或我会写的任何东西都要好。你选择任何框架,因为你相信你会从使用经过严格设计的代码中获得提升,拥有更广泛的受众,经过更彻底的测试。而且几乎在每一个方面都比你自己写的东西更好。我不会让(诚然)大量的依赖项阻止我使用它。当我在应用程序服务器上部署并为该JVM分配256 MB RAM时,我当然不太关心烫发空间是否占用了总数的10% - 直到我测量这是一个问题。

我认为真正发生的事情是你宁愿写PHP而不是Java。这是一个公平的想法,因为很多人认为使用动态语言可以提供比Java更多的价值。大多数网站仍然是用PHP编写的,所以你的怀疑是有道理的。

我建议使用一两个用例的原型,无论有没有Spring,并使用PHP。在那之后,你会更好地了解什么对你有用。


答案 2

类装入器应该只装入它需要的类,并且它们保持内存驻留。不要担心 12 MB。内存很便宜。您创建的对象(在大型应用程序中)将使用比加载的类多得多的内存。

所以简而言之,不要担心它。:)

有一篇关于 IBM DeveloperWorks 的好文章,标题为“揭开类装入问题的神秘面纱,第 1 部分:类装入和调试工具简介”

另外一点 - 当涉及到成本时,开发人员时间的成本远远超过硬件,因此,如果Spring / Hibernate / WhateverTool可以帮助您开发人员更快,更轻松地构建应用程序,那么无论使用什么RAM的成本都非常值得。


推荐