Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java性能逐渐下降_Java_Performance - Fatal编程技术网

Java性能逐渐下降

Java性能逐渐下降,java,performance,Java,Performance,我有一个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); } } publ

我有一个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);
    }
}
public void slowsdown超时(){

对于(int i=0;i我认为,这是由于遗漏了代码(这里的一些代码填充了大对象…)造成的。请尝试以下方法:

public void slowsDownOverTime() {
    BigObject bigObject = new BigObject();
    // some code here that populates big object ...
    for (int i=0 ; i<nIter ; i++) {
        CustomSerializer.write(bigObject);
    }
}
public void slowsdown超时(){
BigObject BigObject=新的BigObject();
//这里有一些填充大对象的代码。。。

对于(int i=0;i来说,在使用jvisualvm的探查器进行了大量徒劳的工作之后,我求助于添加大量日志记录。这给了我一个线索,即问题是在填充BigObject的Hibernate操作中出现的。我能够通过在检索到每个对象后立即将其逐出来解决性能问题


我不是一个很好的Hibernate专家,但我认为发生的事情是,即使对象超出了我代码中的范围(并因此被垃圾收集),Hibernate在其缓存中保留每个对象的副本。然后,当它执行下一次检索时,它将检索到的对象与所有缓存的对象进行比较。随着缓存数量的增加,此操作将花费越来越长的时间。

如果您定期调用
System.gc()
,问题是否仍然存在(例如,所有
10_000
迭代)?是否只有
CustomSerializer.write
速度慢?是否附加到文件?问题可能与写入方法内部发生的情况有关,不,对象本身我同意@GotoFinal所说的。不过,我要补充的是,找出发生的情况的最简单方法可能是使用探查器。简单的示例profiler应该做到这一点,Java中有太多的选项可供选择,例如VisualVM(我相信JDK仍然附带VisualVM)。您是否尝试分析代码?从技术上讲,我认为您的意思是将填充大对象的代码放入循环中。您编写的方式是,每次都写入相同的对象内容,而我的代码(位于顶部)每次都写入不同的内容。我更仔细地查看了代码,它与此非常接近示例显示,对我的更正进行模化,而不是对它的原始掌握。BigObject实例在循环的每次迭代中都是相同的,但其内容会发生变化。我已将必要的更改量降至最低(也就是说,很多BigObject成员在一次迭代到下一次迭代中都是相同的——不仅仅是内容,而是实际的对象;因此,成为BigObject成员的对象的创建/破坏被最小化了。)我的建议是(用于测试)将填充
bigObject
的代码放在循环外部。这样,您将在每次迭代中写入相同的数据。然后将其与您的版本进行比较。是否在执行序列化的循环外部填充了bigObject的测试(因此仍然序列化nIter次,但每次都是相同的对象).在这种情况下,没有可检测到的减速。