java - Java 性能逐渐下降
问题描述
我有一个 Java 类做这样的事情:
public void slowsDownOverTime() {
for (int i=0 ; i<nIter ; i++) {
BigObject bigObject = new BigObject();
// some code here that populates big object ...
CustomSerializer.write(bigObject);
}
}
我观察到的是,随着代码的迭代,序列化程序编写所需的时间越来越长。启动时,序列化程序以毫秒为单位运行;经过几万次迭代后,运行需要几秒钟。
序列化程序写入的磁盘远未满,并且在发生这种情况时,正在使用的 Java 堆空间远未接近其最大值。
在可能的范围内,我已经减少了在这个周期中创建和销毁的对象的数量和大小。这基本上耗尽了我解决此类问题的工具包!
任何关于我如何理解和纠正逐渐性能下降的建议将不胜感激!
解决方案
我认为,这是由遗漏的代码引起的(这里的一些代码填充了大对象......)。尝试这个:
public void slowsDownOverTime() {
BigObject bigObject = new BigObject();
// some code here that populates big object ...
for (int i=0 ; i<nIter ; i++) {
CustomSerializer.write(bigObject);
}
}
这将始终写入相同的对象,我希望这不会降低性能。
我认为遗漏的代码构建了一个不断增长的数据结构,被bigObject
. 请记住,在序列化时,Java 会深入遍历所有依赖对象并序列化所有依赖对象。所以它会在每次迭代中写入越来越多的数据。这可能是导致性能下降和使用大量磁盘空间的原因。
推荐阅读
- node.js - 混淆使用 Node.js Passport 模块身份验证
- visual-studio-code - 视觉工作室代码自动填充文件内容
- python - 按钮/元素不可交互
- c - Code Composer Studio:未解析的符号仍然存在
- php - 如何在没有插件的情况下从特定类别的帖子的 URL 中删除日期?
- linux - 在 Haskell 中,在检索时间的同时同步硬件时钟会导致严重的问题吗?
- apache-spark - 我们有火花连续处理的监听器吗?
- docker - Spring Cloud Data Flow:在 Kubernetes 集群中运行示例应用程序“partitioned-batch-job”时出现 Docker URI 错误
- asp.net - google AuthenticationManager.GetExternalLoginInfoAsync() 总是返回 null
- java - 如何区分 RequestInterceptor 中两个/多个端点之间的标头