我曾与一些项目合作,其中实现更好的性能和减少内存消耗是主要目标。但请相信我已经很难控制Java中的内存消耗。
这个wiki page,在“ Java Program Speed ”上说 在某些情况下,Java在低级和数字基准测试中等同于C ++。
These statistics并没有真正显示时间计算性能基准的主要差异。 但是,Java中的内存使用率远远高于C ++,因为每个对象的开销为8字节,Java中的每个数组为12字节(32位; 64位java中的两倍),如上所述。以上wiki链接。
现在问题是 人们采取什么措施来最小化Java中的内存利用率?
请注意,我非常关注内存而不是性能,因为我想不出比“编写更好的程序”和“正确调整JDK中的内存”更好的方法
答案 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大小。确定原因是什么,并开始调整对象创建。
希望它有所帮助...