我正在构build一个Java Web应用程序,使用Play! 框架 。 我在playapps.net上托pipe它。 对于内存消耗的图表,我一直困惑不解。 这是一个示例: 该图来自一致但名义上的活动时期。 我没有做任何事情来触发内存的衰退,所以我认为这是因为垃圾收集器几乎达到其允许的内存消耗量而运行的结果。 我的问题: 假设我的应用程序没有内存泄漏,这对我来说是公平的,因为看起来垃圾收集器在运行时正确回收了所有的内存? (从标题)为什么Java等待,直到最后可能秒运行垃圾回收器? 内存消耗增长到图表的前四分之一,我看到显着的性能下降。 如果我上面的说法是正确的,那么我怎么能解决这个问题呢? 我读到的其他post似乎反对调用System.gc() ,从中性(“这只是一个请求运行GC,所以JVM可能会忽略你”),直接反对(“代码依赖System.gc()从根本上被打破“)。 或者我在这里基地,我应该在我自己的代码寻找缺陷造成这种行为和间歇的性能损失? 我为问题的大脑转储道歉。 我一直在debugging这个问题一段时间,并会非常感谢任何指针。 UPDATE 我在PlayApps.net上开了一个关于这个问题的讨论,并提到了一些要点。 具体来说,@About的评论关于一个完整的GC的设置非常保守,@ G_H关于初始和最大堆大小设置的评论。 这里有一个讨论链接 ,不幸的是你需要一个playapps帐户来查看它。 我会在这里报告反馈; 非常感谢大家的回答,我已经从他们身上学到了很多东西! parsing度 Playapps的支持,这还是很棒的,对我来说没有太多的build议,他们唯一的想法是,如果我广泛使用caching,这可能会让对象的存活时间比需要的长,但事实并非如此。 我还是学了一吨(呜呼!),我给@Ryan Amos一个绿色的支票,因为我每半天都会打电话给System.gc() ,现在工作正常。 再次感谢所有的帮助,一如既往!
帮助我解决与同事的争议:在Java中设置一个variables或集合为null帮助垃圾收集并减less内存使用量? 如果我有一个长时间运行的程序,并且每个函数都可能被迭代调用(可能数千次):在将值返回给父函数之前,是否将其中的所有variables设置为null有助于减less堆大小/内存使用情况?
我听说了一个字节在一个Java程序中占用的内存量的不同意见。 我知道你可以在java字节中存储不超过+127, 文档说一个字节只有8位,但在这里我被告知它实际上占用与int相同数量的内存,因此只是一种有助于代码理解而不是效率的types。 任何人都可以清除这个,这是一个具体的实现问题?
随着std::unique_ptr的出现,瑕疵的std::auto_ptr最终可以被搁置。 所以最近几天,我一直在改变我的代码使用智能指针,并消除从我的代码的所有delete 。 虽然valgrind说我的代码是内存清理的,但是智能指针的语义丰富性会使代码变得更清晰和更容易理解。 在大多数代码中,翻译很简单:使用std::unique_ptr代替拥有的对象持有的原始指针,抛出delete ,然后小心地get() , reset()和move()调用需要与其他代码进行良好的交互。 我现在正在将非拥有的原始指针翻译成智能指针。 由于我对我的对象的生命周期(我确保我的模块只依赖于一个方向)的生命周期小心,valgrind告诉我,我没有任何未初始化的读取,悬挂指针或泄漏。 所以,从技术上讲,我现在可以把那些非拥有的原始指针单独留下。 但是,一个select是将那些非拥有的原始指针改为std::shared_ptr因为我知道它们是非循环的。 或者,将它们作为原始指针会更好吗? 我需要智能指针的资深用户提供一些build议,关于用什么规则来决定是否保留非拥有的原始指针 ,或者将它们转换成std::shared_ptr ,请记住,testing和valgrind我的代码。 编辑:我可能会误解std::shared_ptr的使用 – 它们可以与std::unique_ptr一起使用,或者,如果我使用std::shared_ptr ,所有的句柄也应该是std::shared_ptr ?
我的应用程序被凶手杀害。 它是运行在没有交换的现场USB上的Ubuntu 11.10,并且PC具有1G的RAM。 运行唯一的应用程序(除了所有内置的Ubuntu的东西)是我的程序flasherav。 请注意,/ tmp是内存映射,并在崩溃时有大约200MB的文件(所以占用了〜200MB的RAM)。 我想了解如何分析om-killer日志,以便我能够理解所有内存的使用情况 – 即哪些不同的块将加起来达到1 gig,导致oom-killer踢在? 一旦我明白了,我可以努力减less罪犯的使用,所以应用程序将运行在1 GB的RAM机器上。 我的具体问题是。 为了分析这种情况,我总结了“total_vm”这一列,我只得到了609342KB(在/ tmp中添加到200MB时仍然只有809MB)。 也许我错了什么是“total_vm”列 – 是否包括分配,但没有使用的内存加共享内存。 如果是的话,那么它不应该夸大实际使用的内存(因此我不应该内存不足),对不对? 是否还有其他使用中的内存块没有在下面列出? [11686.040460] flasherav invoked oom-killer: gfp_mask=0x201da, order=0, oom_adj=0, oom_score_adj=0 [11686.040467] flasherav cpuset=/ mems_allowed=0 [11686.040472] Pid: 2859, comm: flasherav Not tainted 3.0.0-12-generic #20-Ubuntu [11686.040476] Call Trace: [11686.040488] [<c10e1c15>] dump_header.isra.7+0x85/0xc0 [11686.040493] [<c10e1e6c>] oom_kill_process+0x5c/0x80 [11686.040498] [<c10e225f>] out_of_memory+0xbf/0x1d0 [11686.040503] [<c10e6123>] […]
为了估计最大呼叫深度,recursion方法可以用给定量的存储器来实现,在堆栈溢出错误可能发生之前,用于计算所使用的存储器的(近似)公式是什么? 编辑: 许多人回答“依赖”,这是合理的,所以让我们用一个简单而具体的例子来删除一些variables: public static int sumOneToN(int n) { return n < 2 ? 1 : n + sumOneToN(n – 1); } 很容易certificate,在我的Eclipse IDE中运行这个在n下刚刚爆炸了1000(对我来说令人惊讶的低)。 这个通话深度限制是否已经被估计而不执行? 编辑:我不禁想到,Eclipse有一个固定的最大通话深度1000,因为我得到了998 ,但有一个主要的,一个最初的调用方法,总共1000 。 这是一个恕我直言,“太圆”是一个巧合。 我会进一步调查。 我只有Dux开销-Xss vm参数; 这是最大的堆栈大小,所以Eclipse runner必须在-Xss1000设置的地方
我在程序上运行了一个堆转储。 当我在内存分析工具中打开它时,我发现org.logicalcobwebs.proxool.ProxyStatement的java.lang.ref.Finalizer占用了大量内存。 这是为什么?
背景 我们有一个大约20个Linux刀片的池。 一些运行Suse,一些运行Redhat。 共享NAS空间,其中包含以下3个文件夹: / NAS / app / java – 指向安装Java JDK的符号链接。 目前版本1.5.0_10 / NAS / app / lib – 一个指向我们应用程序版本的符号链接。 / NAS / data – 我们的输出被写入的目录 我们所有的机器都有2个处理器(超线程),4GB的物理内存和4GB的交换空间。 我们将每台机器可以在给定时间处理的“工作”数量限制为6个(这个数字可能需要改变,但是这并不会成为当前的问题,所以请暂时忽略它)。 我们的一些工作设置了最大堆大小为512mb,其他一些预留最大堆大小为2048mb。 再一次,我们意识到如果6个作业在堆大小设置为2048的同一台机器上启动,我们可以检查可用内存,但据我们所知,这还没有发生。 问题 有一次,一个作业将立即失败并显示以下消息: Error occurred during initialization of VM Could not reserve enough space for object heap Could not create the Java virtual machine. […]
我正在开发一个当前有数百个对象创build的应用程序。 是否有可能确定(或近似)由对象(类实例)分配的内存?
我有一个网关脚本,返回到客户端的JSON。 在脚本中,我使用set_error_handler来捕获错误,并仍然有一个格式化的返回。 它受到“允许的内存大小耗尽”的错误,但不是像ini_set('memory_limit','19T')那样增加内存限制,我只是想返回用户应该尝试其他的东西,因为它过去很多记忆。 有没有什么好方法来捕捉致命的错误?