好吧,这个问题可能看起来很愚蠢,但我还是要问它。
经过数小时努力让 Spring + BlazeDS 项目启动并运行后,我发现我的项目出现了问题,因为没有包含 Spring 等的正确依赖项。我的 WEB 中缺少 .jars- INF/lib 文件夹,是的,我很傻。
一段时间后,我设法将所有 .jar 文件放到了它们所属的位置,当时它的大小高达 12.5MB,而且有超过 30 个!这让我很担心,但它可能并且希望不应该担心。
Java 是如何根据这些 JAR 文件运行的,考虑到它是压缩和编译的源代码,它们确实占用了相当多的硬盘空间。这样就可以在瞬间快速填充大量 RAM。
我的问题是:
当实例化 .jar 中的类时,Java 是否会将整个 .jar 文件加载到内存中? .jar 中永远不会被使用的东西呢?
.jar 是否会以某种方式缓存,以优化应用程序性能?
当加载单个 .jar 时,我知道该东西位于内存中,并且可用于多个 HTTP 请求(即在服务器实例运行的生命周期内),这与 PHP 不同,PHP 对象是随每个请求动态创建的,这个假设正确吗?
我在想,在使用 Spring 时,我必须包含所有那些繁琐的 .jars,难道我只使用 native Java 会更好吗?至少可以说是像 Hibernate 这样的 ORM 解决方案?
到目前为止,Spring 只是花费了额外的时间配置、额外的硬盘空间、额外的内存、cpu 消耗,所以我担心框架会花费太多的应用程序性能,例如,用我的 IoC 实现BlazeDS 服务器。
仍然需要 ORM,一个单元测试框架和零碎的东西。快速且不负责任地轻松地膨胀一个项目是如此容易。
我在哪里画线?
最佳答案
"Does Java load an entire .jar file into memory when say for instance a class in that .jar is instantiated? What about stuff that's in the .jar that never gets used."
不,类加载器会根据需要加载每个 .class 文件。
"Do .jars get cached somehow, for optimized application performance?"
JAR 就像 DLL(除了有关链接与类加载的详细信息):它们只是 .class 文件的压缩库。它们没有被缓存:.class 文件根据需要加载到 perm 空间中。
"When a single .jar is loaded, I understand that the thing sits in memory and is available across multiple HTTP requests (i.e. for the lifetime of the server instance running), unlike PHP where objects are created on the fly with each request, is this assumption correct?"
当您的应用服务器将 .class 加载到 perm 空间时,只要服务器启动并运行,它就可用。
"When using Spring, I'm thinking, I had to include all those fiddly .jars, wouldn't I just be better off just using native Java, with say at least and ORM solution like Hibernate?"
如果您认为使用 Spring 为您带来了一些好处,那就不会了。如果您认为成本/ yield 分析对您不利,请务必不要使用 Spring。但是,如果依赖项阻碍了您,这听起来不像您在进行良好的分析。
"So far, Spring just took extra time configuring, extra hard drive space, extra memory, cpu consumption, so I'm concerned that the framework is going to cost too much application performance just to get for example, IoC implemented with my BlazeDS server."
您不知道使用 Spring 的性能损失是多少。如果您认为这是一个问题,请测量它。我敢打赌,您的应用程序代码或数据库架构将是最大的问题。
"There still has to come ORM, a unit testing framework and bits and pieces here and there. It's just so easy to bloat up a project quickly and irresponsibly easily."
为什么不负责任?
"Where do I draw the line?"
无论如何,写你自己的。从头开始做这一切。您将更好地了解框架为您购买的内容以及完成后的实际成本。
我要补充一点:Spring 的人们编写了一些最好的代码。比你我写的任何东西都要好。您选择任何框架,因为您相信使用经过严格设计、拥有更广泛的受众、经过更彻底测试的代码会让您受益匪浅。并且几乎在所有方面都比你自己写的要好。我不会让(不可否认的)大量依赖项阻止我使用它。当我在应用服务器上部署并为该 JVM 分配 256 MB 的 RAM 时,我当然不在乎 perm 空间是否占用了总数的 10% - 直到我测量到这是一个问题。
我认为真正发生的事情是您更愿意编写 PHP 而不是 Java。这是一个公平的想法,因为很多人认为使用动态语言可以提供优于 Java 的值(value)。大多数网站仍然是用 PHP 编写的,所以你的怀疑是有道理的。
我建议使用和不使用 Spring 并使用 PHP 对一个或两个用例进行原型(prototype)设计。之后你会更好地了解什么对你有用。
关于java - JAR 文件,它们不只是膨胀并减慢 Java 的速度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1004368/
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A