减少Java中的内存消耗

时间:2012-09-24 04:13:53

标签: java performance memory

我曾与一些项目合作,其中实现更好的性能和减少内存消耗是主要目标。但请相信我已经很难控制Java中的内存消耗。

这个wiki page,在“ Java Program Speed ”上说 在某些情况下,Java在低级和数字基准测试中等同于C ++。

These statistics并没有真正显示时间计算性能基准的主要差异。 但是,Java中的内存使用率远远高于C ++,因为每个对象的开销为8字节,Java中的每个数组为12字节(32位; 64位java中的两倍),如上所述。以上wiki链接。

现在问题是 人们采取什么措施来最小化Java中的内存利用率?

请注意,我非常关注内存而不是性能,因为我想不出比“编写更好的程序”和“正确调整JDK中的内存”更好的方法

4 个答案:

答案 0 :(得分:3)

根据您的工作情况,您可以从不同的编程实践中受益,例如:

  • 限制在实际使用它们之前初始化的变量数量。
    • 只是一个很好的编码提示。已经初始化并且暂时不需要的变量会保留不需要的内存,这可能会浪费资源。
  • 适用时通过静态对象进行对象缓存。
    • 我以前在反射繁重的应用程序中使用过这个,我需要在循环中的对象上获取成员列表,它可以根据可能需要的情况大大提高性能。
  • 适用的对象池
  • 如果您正在编写多线程应用程序,则可以利用线程池来通过限制创建和启动新线程的工作量来获得性能。

答案 1 :(得分:1)

除了减少您创建的对象数量并尝试使对象短暂存在之外,您对内存的处理并不多。但是,Java仍将使用允许的所有内存以获得最佳性能。

答案 2 :(得分:1)

  

人们采取什么措施来最小化Java中的内存利用率?

他们研究的是小基准,而不是对阵列大小的微观测试。

您可以尝试将Java的引用(即使在64-JVM上使用4个字节)与C ++共享指针(在64位进程上可以使用48个字节)进行比较,并得出一些不太可能的结论。在真实的程序中很有用。

  

我非常关心内存而不是性能,因为我无法想到比“编写更好的程序”和“正确调整JDK中的内存”更好的方法

通常您只需要使用内存分析器。这将有助于您最大限度地减少Java中的内存消耗。

我发现在大多数情况下保存每个字节都是不合时宜的。在PC中,一个字节的内存大约需要5e-7美分。或者大约2e-6秒的时间。这些可以加起来,但如果你只保存100 KB,可能不值得更改任何代码来执行它,如果你要节省1 GB,可能值得花几个小时就可以了。即使你节省了1 GB,内存也是可以重复使用的,但你的时间不是。

  

“如果内存是主要约束,你需要java吗?”

我同意这一点,如果您的设备有几MB,例如小于Android手机,那么C将是您的最佳选择。如果您的设备至少具有智能手机容量,则可能是Java可以满足您的需求。

答案 3 :(得分:0)

在java中管理内存有两个动机。

<强> 1。避免频繁创建/删除对象。

这反过来会避免GC经常被唤醒,因为这会导致一个或多个执行线程暂停。

避免暂时/永久性记忆漏洞

<强> 2。减少VM的整体内存消耗

如果您的VM将在您有严格内存限制的环境中运行,则需要这样做。

理想情况下,从内存的角度来看,编写良好的java程序应该尝试实现上述两种方法。 现在要达到1,你应该做到以下几点。

  • 首选静态内存分配,即每个VM分配一次,而不是 动态内存分配。

  • 避免在函数中创建临时对象,以实现此目的 对象可以实现一个reset()方法,该方法可以允许对象 重复使用

  • 了解您正在使用的API,例如。如果你使用String,你将是 最终创建与修改一样多的实例。该 同样适用于自动盒装类型。

以上几点也有助于管理或控制第2点

要检查VM内存大小,您需要执行上述要点并执行以下操作

启动虚拟机时使用Xmx和Xms标志,故意将其值设置为低于可能需要的值,并注意OutOfMemoryError。

如果发生OutOfMemoryError,则表示您已经过度拍摄最大VM大小。确定原因是什么,并开始调整对象创建。

希望它有所帮助...

相关问题