好吧,问题可能看起来很愚蠢,但无论如何我都会问它.
经过几个小时的努力让Spring + BlazeDS项目启动并运行后,我发现由于没有包含Spring等的正确依赖项而导致我的项目出现问题.我的WEB-INF/lib中缺少.jars文件夹,是的,傻我.
过了一会儿,我设法得到他们所属的所有.jar文件,并且它的高达12.5MB,其中超过30个!这关系到我,但它可能并且希望不应该担心.
Java如何在这些JAR文件中运行,它们确实占用了相当多的硬盘空间,考虑到它是压缩和编译的源代码.这样就可以在瞬间快速填充大量内存.
我的问题是:
Java是否会将整个.jar文件加载到内存中,例如说.jar中的类是实例化的?那些永远不会被使用的.jar中的东西呢.
.jars以某种方式缓存,以优化应用程序性能?
当加载单个.jar时,我理解该东西位于内存中并且可用于多个HTTP请求(即运行时服务器实例的生命周期),这与PHP中每次请求即时创建对象的情况不同,这是假设正确吗?
当我使用Spring时,我想,我必须包括所有那些繁琐的.jars,我不会只是使用本机Java,至少比如Hibernate和ORM解决方案更好吗?
到目前为止,Spring只花了额外的时间配置,额外的硬盘空间,额外的内存,CPU消耗,所以我担心框架会花费太多的应用程序性能,例如,我的BlazeDS服务器实现了IoC.
还有必须来ORM,一个单元测试框架和点点滴滴.这很容易让项目快速且不负责任地膨胀.
我在哪里划线?
duf*_*ymo 51
"例如,当.jar实例化了一个类时,Java是否会将整个.jar文件加载到内存中?那些.jar中的内容从未被使用过."
不,类加载器根据需要加载每个.class文件.
"为了优化应用程序性能,.jars会以某种方式缓存吗?"
JAR就像DLL一样(除了链接与类加载的细节之外):它们只是.class文件的压缩库.它们不是缓存的:.class文件根据需要加载到perm空间.
"当加载单个.jar时,我理解该东西位于内存中并可在多个HTTP请求中使用(即在运行的服务器实例的生命周期内),这与PHP中每次请求即时创建对象的情况不同,这个假设是对的?"
当您的应用服务器将.class加载到perm空间时,只要服务器启动并运行,它就可用.
"当我使用Spring时,我想,我必须包括所有那些繁琐的.jars,我不会只是使用原生Java,至少比如Hibernate和ORM解决方案更好吗?"
如果您认为使用Spring会给您带来某些东西,那就不是了.如果您认为成本/收益分析不利于您,请务必不要使用Spring.但是,如果依赖性阻止了你,那听起来并不像是在做一个好的分析.
"到目前为止,Spring只花了额外的时间配置,额外的硬盘空间,额外的内存,CPU消耗,所以我担心该框架会花费太多的应用程序性能,例如,用我的BlazeDS服务器实现IoC ".
您不知道使用Spring会有什么性能损失.如果您认为这是一个问题,请测量它.我敢打赌,您的应用程序代码或数据库架构将是最大的问题.
"仍然需要ORM,一个单元测试框架和点点滴滴.这很容易让项目迅速而不负责任地轻松实现."
为什么不负责任?
"我在哪里划线?"
无论如何,写下你自己的.从头开始做.您将更好地了解框架为您购买的内容以及完成后的实际成本.
我将补充一点:Spring的人们写了一些最好的代码.比你或我写的任何东西都要好.您选择任何框架都是因为您相信您可以使用经过严格设计的代码,拥有更广泛的受众,经过更彻底的测试.几乎每一项措施都比你自己写的更好.我不会让(诚然)大量的依赖关系阻止我使用它.当我在应用服务器上部署并为该JVM分配256 MB的RAM时,如果烫发空间占用总数的10%,我当然不在乎 - 直到我测量它是一个问题.
我认为真正发生的是你宁愿写PHP而不是Java.这是一个公平的想法,因为很多人认为使用动态语言可以提供超过Java的价值.大多数网站仍然使用PHP编写,因此您的怀疑是合理的.
我建议使用和不使用Spring并使用PHP对一个或两个用例进行原型设计.在那之后你会更好地了解对你有用的东西.
类加载器应该只加载它需要的类,并保持内存驻留.不要担心12 MB.RAM很便宜.您创建的对象(在大型应用程序中)将使用比加载的类更多的内存.
所以简而言之,不要担心.:)
IBM DeveloperWorks上有一篇很好的文章标题为"解密类加载问题,第1部分:类加载和调试工具简介"
附加点 - 当涉及到成本时,开发人员时间的成本比硬件的成本高,所以如果Spring/Hibernate/WhateverTool帮助开发人员更快更容易地构建应用程序,那么无论是什么RAM都是值得的.用过的.