可能这是一个众所周知的问题,但我没有找到这个问题的最佳引用...
计算和分配默认 u 限制、详细(用于 gc)和最大堆内存值的公式是什么?
如果没有特定的公式,那么为特定机器指定此公式的标准是什么。
如果可能的话,谁也请解释一下这些概念。
为了提高性能,我们还需要考虑其他概念吗?
如何调整 JVM 以获得更好的性能,
最佳答案
停止你现在正在做的事情。
调整 JVM 可能是您应该担心的最后事情。在您完成本书中的所有其他性能技巧之前,默认设置应该就可以了。
首先,您需要分析您的应用程序并找出瓶颈所在。具体来说,您会想知道:
- 哪些函数/方法消耗了大部分 CPU 时间?
- 所有内存分配都发生在哪里?
- 什么类型的对象占用了堆上的大部分空间?
然后您应该对引起问题的区域进行有针对性的优化。有数千种有效的技术,但以下是我认为最有用的技术:
- 改进算法 - 任何占用大量 CPU 时间且复杂度为
O(n^2)
或更差的算法都可能是改进的良好候选者。尝试使其达到O(n log n)
或更好。 - 共享不可变数据 - 如果您有相同数据的大量副本,那么将它们转换为不可变对象(immutable对象)并共享单个实例是有意义的。这可以节省大量内存(并且对于提高线程安全性/并发性有很好的效果)
- 使用基本类型 - 将
Integer
替换为int
等。这样可以节省内存并使数值运算更快。 - 偷懒 - 在确实需要之前不要计算它们。
- 缓存内容 - 如果某些内容计算成本较高但请求频繁,请在第一次请求后将其存储在缓存中。使用由
SoftHashMap
支持的缓存,以便在需要时仍然可以释放内存。 - 卸载工作 - 您可以利用多个核心吗?客户端应用程序可以为您完成一些工作吗?
进行任何更改后,您需要再次分析。至少,您需要确认您的优化确实有帮助。此外,修复一个瓶颈通常会将瓶颈转移到应用程序的另一部分。因此,您需要确定接下来要关注的新位置。
重复此操作,直到您的应用程序足够快(根据您自己或客户的要求定义)。
关于java - 我们可以在 java 中实现的性能改进功能列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21541446/