首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中减少内存消耗

在Java中减少内存消耗
EN

Stack Overflow用户
提问于 2012-09-24 04:13:52
回答 4查看 36.7K关注 0票数 10

我曾经参与过一些项目,这些项目的主要目标是实现更好的性能和减少内存消耗。但是相信我,用Java控制内存消耗已经很难了。

这个wiki页面,在"Java程序速度“上说,在某些情况下,在低级别和数字基准测试上等同于C++。

这些统计数字在时间计算性能基准方面并没有显示出很大的差异。但是,Java中的内存使用量要比C++高得多,因为Java中的每个对象有8字节的开销,每个数组有12字节的开销(32位;64位java中是上面提到的64位java的两倍)。

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

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

EN

回答 4

Stack Overflow用户

发布于 2012-09-24 04:26:31

根据您正在从事的工作,您可以从不同的编程实践中获益,例如:

  • 限制在实际使用之前初始化的变量的数量。
    • 只是一个很好的编码提示。一个已经初始化并且暂时不需要的变量保留在内存中,这些内存还不需要,这可能会浪费资源。

  • 对象缓存通过静态对象在适用的情况下。
    • 我以前在反思性的应用程序中使用了这种方法,在这种应用程序中,我需要在循环中获取对象上的成员列表,根据可能需要的情况,它可以很大程度上提高性能。

  • 对象池(如果适用的话)
    • http://www.javaworld.com/jw-06-1998/jw-06-object-pool.html

  • 如果您正在编写多线程应用程序,则可以通过限制创建和启动新线程的工作量来利用线程池来获得性能。
    • http://www.ibm.com/developerworks/library/j-jtp0730/

票数 6
EN

Stack Overflow用户

发布于 2012-09-24 04:54:50

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

1.避免频繁创建/删除对象.

这反过来又避免了GC经常醒来,因为这会导致一个或多个执行线程挂起。

避免临时/永久内存漏洞

2.减少VM的总体内存消耗

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

理想情况下,从内存的角度来看,一个编写良好的java程序应该尝试并实现上述这两个目标。现在,要实现1,您应该执行以下操作。

  • 更喜欢静态内存分配,即每个VM分配一次,而不是动态内存分配。
  • 避免在函数中创建临时对象,为此,大多数对象可以实现reset()方法,该方法允许对象重用
  • 了解您正在使用的API,例如。如果您使用字符串,您将 最终创建的实例与修改的实例一样多。自动装箱类型也是如此。

以上各点亦有助管理或控制第2点。

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

在启动VM时使用Xmx和Xms标志,并故意将它们的值设置为低于可能需要的值,并注意OutOfMemoryError。

如果OutOfMemoryError发生了,这意味着您已经超过了最大VM大小。确定原因,并开始调优您的对象创建。

希望能帮上忙..。

票数 3
EN

Stack Overflow用户

发布于 2012-09-24 04:23:18

除了减少您创建的对象的数量和尝试使您的对象短命之外,您对内存无能为力。但是,Java仍将使用它所允许的所有内存,以获得最佳性能。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12558767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档