我正在編寫一些Java代碼時出現了一個非常奇怪的錯誤。如果我運行了一些並行代碼,我已經完成了它的運行,但是如果我在同一次運行中多次運行相同的代碼,那麼每次運行時都會變得越來越慢。使用複製運行時的Java線程
如果我將線程數從4增加到8,則每次迭代的減速都會更加劇烈。
每次運行都是完全獨立的,我甚至將運行時變量設置爲null以清除舊運行。所以我不知道什麼可能會放慢速度。我一直在使用Visual VM,它說.run()將所有的時間花費在「Self Time」或「Thread.init()」上,這是沒有用的。
一些代碼片段:
for (int r = 0; r < replicateRuns; ++r) {
startTime = System.nanoTime();
result = newRuntime.execute();
result = null;
System.out.println((System.nanoTime() - startTime)/1000000);
total += System.nanoTime() - startTime;
}
parentThread = this;
thread = new Thread[numberOfThreads];
barrier = new CyclicBarrier(numberOfThreads);
for (int i = 0; i < numberOfThreads; i++) {
thread[i] = new Thread(new Runtime(parentThread, variation, delta, eta, i,
numberOfThreads), i + "");
thread[i].start();
}
for (int i = 0; i < numberOfThreads; i++) {
try {
thread[i].join();
thread[i] = null;
} catch (Exception ex) {
ex.printStackTrace();
}
}
因此,在爲什麼,如果我啓動Java應用程序很多次我拿到像樣的成績任何線索,但如果我運行中的多次同樣的啓動速度一切都會變慢,儘管據我所知我沒有任何東西,所以GC來了並清理它。
我正在使用線程局部變量,但從我讀過的所有清理線程本身設置爲空時。
乾杯的任何幫助!
編輯1:
感謝您的所有幫助。情節變厚了,在我的Windows桌面上(與我的MacBook相反),根本沒有問題,每個線程都運行良好,即使增加運行量也不會減速!在看了這一天之後,我會在早上第一次嘗試Eclipse MAT。
關於源代碼,我用MOEAD的並行版本擴展了MOEA框架,因此提供了許多依賴和類。 MOEA framework你可以找到我的課程here的來源。基本上迭代被重複調用,直到numberOfEvaulations達到設定值。
爲了更快獲得更好的幫助,您應該嘗試創建[SSCCE](http://sscce.org/)。這樣,人們將能夠測試您的代碼,重現問題並可能發現問題。例如,如果不知道「新運行時(...)」是什麼,就很難推理你的問題。 – assylias
我會嘗試發佈更多的代碼,但是有一個巨大的類層次結構,我不想用一層代碼來發送垃圾郵件。這更像是一個普遍的「我需要做更多的事情而不是一個線程」來清除它的問題。 – masterjonny
這個想法是從你的代碼中提取一個複製行爲的最小可編譯示例。如果線程仍在運行,它將不會被垃圾收集。 – assylias