当前位置: 首页 > 面试题库 >

减少内存流失的方法

洪和风
2023-03-14
问题内容

背景

我有一个Spring批处理程序,该程序读取一个文件(我正在使用的示例文件的大小约为4 GB),对该文件进行少量处理,然后将其写到Oracle数据库中。

我的程序使用1个线程读取文件,并使用12个工作线程进行处理和数据库推送。

我正在搅动很多年轻一代的记忆,这使我的程序运行得比我想象的要慢。

建立

JDK 1.6.18
春季批处理2.1.x
4核计算机,带16 GB内存

-Xmx12G 
-Xms12G 
-NewRatio=1 
-XX:+UseParallelGC
-XX:+UseParallelOldGC

问题

使用这些JVM参数,我可以为Tenured Generation保留大约5.x GB的内存,为Young Generation获得大约5.X GB的内存。

在处理这个文件的过程中,我的终身代可以。它最大可以增长到3 GB,而且我永远不需要做一个完整的GC。

但是,年轻一代创下了最高纪录。它上升到5 GB范围,然后发生并行次要GC,并清除了使用到500
MB的YoungGen。次要GC很好,并且比完整GC更好,但是它仍然使我的程序变慢了很多(我很确定应用程序在出现年轻的gen收集时仍会冻结,因为我看到数据库活动消失了)。对于小型GC,我花费了超过5%的程序时间冻结时间,这似乎过多。我会说
,在处理此4 GB文件的过程中,我经历了50-60GB的年轻一代内存

我的程序没有任何明显的缺陷。我试图遵循通用的OO原则并编写简洁的Java代码。我试图无缘无故地创建对象。我正在使用线程池,并尽可能地传递对象而不是创建新对象。我将开始对应用程序进行性能分析,但
我想知道是否有人有一些良好的通用经验法则或反模式来避免导致过多的内存流失
?我能做的最好的事情是50-60GB的内存搅动来处理4GB的文件吗?我是否必须恢复为对象池之类的JDk 1.2技巧?(尽管Brian
Goetz作了一个演讲,其中包括为什么对象池是愚蠢的,而我们不再需要这样做了。我对他的信任远胜于对自己的信任.. :))


问题答案:

我认为与内存探查器的会话将为您带来很多启发。这样可以很好地概述创建了多少个对象,这很有意义。

我总是惊讶于生成了多少个字符串。

对于域对象,交叉引用也很明显。如果您突然发现派生对象的对象数量比派生对象的对象数量多3倍,则说明发生了某些事情。

Netbeans构建了一个不错的平台。我过去使用过JProfiler。我认为,如果您在Eclipse上花费了足够长的时间,您可以从PPTP工具中获得相同的信息。



 类似资料:
  • 问题内容: 我一直在为OpenGL练习编写Minecraft副本(据我估计很多),但是在编写了基本的渲染API之后,我注意到真正的Minecraft 占用了 大量 内存或内存- 大约800MB!我完全可以理解为什么它必须记住所有的块,以及生成器的小怪和地形数据……我问自己:“此块与该块完全相同。它们可以在代码中吗? ” 并记得C ++有指针,所以我试图用我能想到的唯一方法在Java中做同样的事情,

  • 问题内容: 我想问你如何减少Spring框架的RAM占用量。 我创建了一个简单的helloworld应用来演示该问题。只有两个类和context.xml文件: -主要方法课 -用于模拟某些“工作”的类(无穷循环中的printig Hello) 仅包含以下内容: 测试类仅包含称为的方法,构造后会调用: 我准备了两种情况,在这两种情况下,方法仅包含一行。 在第一种情况下,主要方法是这样做的: App在

  • 问题内容: 我正在尝试将几个文件加载到内存中。这些文件具有以下3种格式之一: 字符串TAB int 字符串TAB浮动 int TAB浮点数。 的确,它们是ngram静态文件,以防解决方案的出现。例如: 目前,我正在执行的伪代码是 令我惊讶的是,尽管磁盘中文件的总大小约为21 mb,但是将其加载到内存中时,该过程将占用120-180 mb的内存!(整个python应用程序不会将其他任何数据加载到内存

  • 本文向大家介绍详解如何减少python内存的消耗,包括了详解如何减少python内存的消耗的使用技巧和注意事项,需要的朋友参考一下 Python 打算删除大量涉及像C和C++语言那样的复杂内存管理。当对象离开范围,就会被自动垃圾收集器回收。然而,对于由 Python 开发的大型且长期运行的系统来说,内存管理是不容小觑的事情。 在这篇博客中,我将会分享关于减少 Python 内存消耗的方法和分析导致

  • 我正在使用spring boot开发客户端应用程序。在运行spring boot应用程序(使用完全可执行的jar)时,x64服务器的内存占用约为190M,x86服务器的内存占用约为110M。 我的jvm选项是(-xmx64m-xms64m-xx:maxpermsize=64m-server),为什么在x64服务器中,内存占用这么大?如何将内存使用量降低到150M以下? 多谢了。