Java代碼執(zhí)行在沒有斷點(diǎn)和正常運(yùn)行的調(diào)試中產(chǎn)生不同的結(jié)果。ExecutorService是否損壞?
HotSpot JIT優(yōu)化消除了計數(shù)循環(huán)中的安全點(diǎn)檢查,這是一個惡作劇。
這是一個非常有趣的問題:一個簡單的Java測試揭示了JVM內(nèi)部的一個重要問題。
沒有立即出現(xiàn)線程轉(zhuǎn)儲的事實表明該問題不在Java代碼中,而是與JVM相關(guān)。線程轉(zhuǎn)儲在安全點(diǎn)打印。延遲意味著VM無法在短時間內(nèi)到達(dá)安全點(diǎn)。
背景當(dāng)沒有Java線程在運(yùn)行時,某些VM操作(GC,Deoptimization,Threaddump和某些其他操作)在世界停頓時執(zhí)行。但是Java線程無法在任意點(diǎn)停止,它們只能在稱為 安全點(diǎn)的某些位置暫停。在JIT編譯的代碼中,安全點(diǎn)通常放置在方法出口和后向分支(即循環(huán)內(nèi)部)中。
就性能而言,安全點(diǎn)檢查相對便宜,但并非免費(fèi)。這就是為什么JIT編譯器試圖在可能的情況下減少安全點(diǎn)的數(shù)量。一種這樣的優(yōu)化是消除計數(shù)循環(huán)中的安全點(diǎn)檢查,即已知具有有限次數(shù)的迭代的具有整數(shù)計數(shù)器的循環(huán)。
驗證理論讓我們回到測試中,檢查是否及時到達(dá)安全點(diǎn)。
添加-XX:+SafepointTimeout-XX:SafepointTimeoutDelay=1000JVM選項。每當(dāng)VM在1000毫秒內(nèi)未達(dá)到安全點(diǎn)時,這應(yīng)該會打印一條調(diào)試消息。
# SafepointSynchronize::begin: Timeout detected:# SafepointSynchronize::begin: Timed out while spinning to reach a safepoint.# SafepointSynchronize::begin: Threads which did not reach the safepoint:# 'pool-1-thread-2' #12 prio=5 os_prio=0 tid=0x0000000019004800 nid=0x1480 runnable [0x0000000000000000] java.lang.Thread.State: RUNNABLE# SafepointSynchronize::begin: (End of list)
是的,它打印出線程pool-1-thread-2無法在1000毫秒內(nèi)停止。這是執(zhí)行程序池的第二個線程,應(yīng)運(yùn)行insertionSort算法。
insertionSort有兩個非常長的嵌套計數(shù)循環(huán),看起來JVM消除了其中的安全點(diǎn)檢查。因此,如果此方法以編譯模式運(yùn)行,則JVM在該方法完成之前無法停止它。如果在方法運(yùn)行時請求世界暫停,則所有其他線程也將等待。
該怎么辦?這個問題早已為人所知。這是相關(guān)的JVM錯誤:JDK-5014723。這不是一個高度優(yōu)先的問題,因為該問題很少出現(xiàn)在現(xiàn)實應(yīng)用中。
JDK 8u92中出現(xiàn)了一個新的JVM標(biāo)志,以解決此問題。-XX:+UseCountedLoopSafepoints總是將安全點(diǎn)檢查放在循環(huán)內(nèi)。
另一種解決方案是通過修改循環(huán)中的計數(shù)器變量將長計數(shù)循環(huán)轉(zhuǎn)換為通用循環(huán)。
例如,如果您替換為問題if (breaker) break;,if (breaker) j = 0;該問題也將消失。
那為什么它在調(diào)試模式下工作呢?在啟動調(diào)試器的情況下啟動JVM時,將禁用某些JIT優(yōu)化,以使調(diào)試信息可用。在這種情況下,編譯后的代碼具有所有安全點(diǎn)檢查。
解決方法TL:DR ExecutorService executorService = Executors.newFixedThreadPool(8);在調(diào)試中并發(fā)運(yùn)行,但在正常運(yùn)行時它會并發(fā)運(yùn)行,但稍后在單線程中運(yùn)行。
我有一些代碼可以在中啟動4個不同的任務(wù)ExecutorService。這些任務(wù)中的兩項應(yīng)幾乎立即完成,其他兩項應(yīng)運(yùn)行一段時間。
這些任務(wù)以秒為單位返回執(zhí)行時間Future<Double>。
此代碼負(fù)責(zé)任務(wù)執(zhí)行和度量:
public Future<Double> measure(int[] arr,ProcessIntArray processIntArray,ExecutorService es) { Callable<Double> task = () -> {long start = System.nanoTime();processIntArray.process(arr);long end = System.nanoTime();return (end - start) / 1000000000.0; }; return es.submit(task);}
稍后,在啟動這些任務(wù)之后,我以相同輸入大小的執(zhí)行順序從前一次運(yùn)行打印它們。
Future<Double> bubbleSortTime = measure(bubbleSortArray,Solution::bubbleSort,executorService); Future<Double> insertionSortTime = measure(insertionSortArray,Solution::insertionSort,executorService); Future<Double> quickSortTime = measure(quickSortArray,Solution::quickSort,executorService); Future<Double> mergeSortTime = measure(mergeSortArray,Solution::mergeSort,executorService); System.out.println(); System.out.println('array size: ' + size); System.out.println('quick sort: ' + quickSortTime.get() + 's'); System.out.println('merge sort: ' + mergeSortTime.get() + 's'); System.out.println('insertion sort: ' + insertionSortTime.get() + 's'); System.out.println('bubble sort: ' + bubbleSortTime.get() + 's');
當(dāng)我在調(diào)試模式下運(yùn)行代碼時,將立即打印2個結(jié)果,并且我需要等待一會兒以獲得第3個結(jié)果(我不必費(fèi)心等待第4個結(jié)果)。
在調(diào)試中啟動后(正確和預(yù)期的):
array size: 1000000 quick sort: 0.186892839s merge sort: 0.291950604sinsertion sort: 344.534256723s
正常執(zhí)行會有所不同,看起來好像在long start = System.nanoTime();執(zhí)行方法measure,然后線程進(jìn)入睡眠狀態(tài),并且在完成insertSort之后,quickSort返回到執(zhí)行中,從而產(chǎn)生輸出:
array size: 1000000 quick sort: 345.893922141s merge sort: 345.944023095sinsertion sort: 345.871908569s
錯了 所有這些線程應(yīng)與newFixedThreadPool javadoc中的所有線程同時運(yùn)行。
/** * Creates a thread pool that reuses a fixed number of threads * operating off a shared unbounded queue. At any point,at most * {@code nThreads} threads will be active processing tasks. * If additional tasks are submitted when all threads are active,* they will wait in the queue until a thread is available. * If any thread terminates due to a failure during execution * prior to shutdown,a new one will take its place if needed to * execute subsequent tasks. The threads in the pool will exist * until it is explicitly {@link ExecutorService#shutdown shutdown}. * * @param nThreads the number of threads in the pool * @return the newly created thread pool * @throws IllegalArgumentException if {@code nThreads <= 0} */public static ExecutorService newFixedThreadPool(int nThreads)
我附上源代碼:
import java.util.Arrays;import java.util.Random;import java.util.concurrent.*;class ThreadedSortingComparsion { Random random = new Random(System.currentTimeMillis()); void popul(int[] array) {for (int i = 0; i < array.length; i++) { array[i] = random.nextInt();} } interface ArraySorter {void sort(int[] array); } public Future<Double> measureTime(int[] array,ArraySorter arraySorter,ExecutorService executorService) {Callable<Double> task = () -> { long start = System.nanoTime(); arraySorter.sort(array); long end = System.nanoTime(); return (end - start) / 1000000000.0;};return executorService.submit(task); } public void start() throws ExecutionException,InterruptedException {ExecutorService executorService = Executors.newFixedThreadPool(8);int size = 1000 * 1000;int[] quickSortArray = new int[size];popul(quickSortArray);int[] bubbleSortArray = Arrays.copyOf(quickSortArray,quickSortArray.length);int[] mergeSortArray = Arrays.copyOf(quickSortArray,quickSortArray.length);int[] originalArray = Arrays.copyOf(quickSortArray,quickSortArray.length);int[] insertionSortArray = Arrays.copyOf(quickSortArray,quickSortArray.length);Future<Double> bubbleSortTime = measureTime(bubbleSortArray,ThreadedSortingComparsion::bubbleSort,executorService);Future<Double> insertionSortTime = measureTime(insertionSortArray,ThreadedSortingComparsion::insertionSort,executorService);Future<Double> quickSortTime = measureTime(quickSortArray,ThreadedSortingComparsion::quickSort,executorService);Future<Double> mergeSortTime = measureTime(mergeSortArray,ThreadedSortingComparsion::mergeSort,executorService);System.out.println();System.out.println('array size: ' + size);System.out.println('quick sort: ' + quickSortTime.get() + 's');System.out.println('merge sort: ' + mergeSortTime.get() + 's');System.out.println('insertion sort: ' + insertionSortTime.get() + 's');System.out.println('bubble sort: ' + bubbleSortTime.get() + 's');executorService.shutdown();for (int i = 0; i < quickSortArray.length; i++) { if (quickSortArray[i] != bubbleSortArray[i] || quickSortArray[i] != mergeSortArray[i] || quickSortArray[i] != insertionSortArray[i]) {throw new RuntimeException(Arrays.toString(originalArray)); }} } public static void mergeSort(int[] ar) {if (ar.length < 5) { bubbleSort(ar); return;}int middle = ar.length / 2;int[] arrayLeft = new int[middle];int[] arrayRight = new int[ar.length - middle];for (int i = 0; i < ar.length; i++) { if (i < middle) {arrayLeft[i] = ar[i]; } else {arrayRight[i - middle] = ar[i]; }}mergeSort(arrayLeft);mergeSort(arrayRight);int indexLeft = 0;int indexRight = 0;int inputArrayIndex = 0;while (true) { int whatToPutInAR = 0; if (indexLeft != arrayLeft.length && indexRight != arrayRight.length) {if (arrayLeft[indexLeft] < arrayRight[indexRight]) { whatToPutInAR = arrayLeft[indexLeft]; indexLeft++;} else { whatToPutInAR = arrayRight[indexRight]; indexRight++;} } else if (indexLeft != arrayLeft.length) {whatToPutInAR = arrayLeft[indexLeft];indexLeft++; } else if (indexRight != arrayRight.length) {whatToPutInAR = arrayRight[indexRight];indexRight++; } if (inputArrayIndex == ar.length) return; ar[inputArrayIndex++] = whatToPutInAR;} } private static void quickSort(int[] ar) {quickSort(ar,ar.length); } static public void quickSort(int[] array,int start,int end) {boolean changed = false;if (end == 0) return;int pivot = array[end - 1];int partitionCandidate = start;for (int i = start; i < end; i++) { if (array[i] < pivot) {swap(array,partitionCandidate++,i);changed = true; } else if (pivot < array[i]) {swap(array,end - 1,i);changed = true; }}if (start < partitionCandidate) { quickSort(array,start,partitionCandidate);}if (partitionCandidate < end) { if (partitionCandidate != start || changed) quickSort(array,partitionCandidate,end);} } public static void swap(int[] ar,int from,int to) {int old = ar[from];ar[from] = ar[to];ar[to] = old; } public static void bubbleSort(int[] array) {for (int i = 0; i < array.length; i++) { for (int j = 0; j < array.length - 1; j++) {if (array[j] > array[j + 1]) { swap(array,j + 1,j);} }} } private static void insertionSort(int[] ar) {for (int i = 0; i < ar.length; i++) { for (int j = i; j >= 1; j--) {boolean breaker = true;if (ar[j] < ar[j - 1]) { breaker = false; swap(ar,j - 1,j);}if (breaker) break; }} } public static void main(String[] args) throws ExecutionException,InterruptedException {ThreadedSortingComparsion s = new ThreadedSortingComparsion();s.start(); }}
編輯:當(dāng)我在Ideone中運(yùn)行它時,代碼工作正常。 http://ideone.com/1E8C51Ideone具有Java版本1.8.0_51在測試我1.8.0_91,1.8.0_92。和1.8.0_45。為什么它可以在ideone上運(yùn)行,但不能在我測試的其他兩臺PC上運(yùn)行呢?
當(dāng)我執(zhí)行線程轉(zhuǎn)儲時,雖然不在調(diào)試中執(zhí)行,但我會等待一會兒,并且在打印完線程轉(zhuǎn)儲后,還會打印結(jié)果。因此線程轉(zhuǎn)儲是在完成插入排序之后完成的。
'C:Program FilesJavajdk1.8.0_45binjava' -Xmx8G -Xss1G -Didea.launcher.port=7533 '-Didea.launcher.bin.path=C:Program Files (x86)JetBrainsIntelliJ IDEA Community Edition 2016.1.3bin' -Dfile.encoding=UTF-8 -classpath 'C:Program FilesJavajdk1.8.0_45jrelibcharsets.jar;C:Program FilesJavajdk1.8.0_45jrelibdeploy.jar;C:Program FilesJavajdk1.8.0_45jrelibextaccess-bridge-64.jar;C:Program FilesJavajdk1.8.0_45jrelibextcldrdata.jar;C:Program FilesJavajdk1.8.0_45jrelibextdnsns.jar;C:Program FilesJavajdk1.8.0_45jrelibextjaccess.jar;C:Program FilesJavajdk1.8.0_45jrelibextjfxrt.jar;C:Program FilesJavajdk1.8.0_45jrelibextlocaledata.jar;C:Program FilesJavajdk1.8.0_45jrelibextnashorn.jar;C:Program FilesJavajdk1.8.0_45jrelibextsunec.jar;C:Program FilesJavajdk1.8.0_45jrelibextsunjce_provider.jar;C:Program FilesJavajdk1.8.0_45jrelibextsunmscapi.jar;C:Program FilesJavajdk1.8.0_45jrelibextsunpkcs11.jar;C:Program FilesJavajdk1.8.0_45jrelibextzipfs.jar;C:Program FilesJavajdk1.8.0_45jrelibjavaws.jar;C:Program FilesJavajdk1.8.0_45jrelibjce.jar;C:Program FilesJavajdk1.8.0_45jrelibjfr.jar;C:Program FilesJavajdk1.8.0_45jrelibjfxswt.jar;C:Program FilesJavajdk1.8.0_45jrelibjsse.jar;C:Program FilesJavajdk1.8.0_45jrelibmanagement-agent.jar;C:Program FilesJavajdk1.8.0_45jrelibplugin.jar;C:Program FilesJavajdk1.8.0_45jrelibresources.jar;C:Program FilesJavajdk1.8.0_45jrelibrt.jar;C:UsersTomasz_MielczarskiIdeaProjectsuntitledoutproductionuntitled;C:Program Files (x86)JetBrainsIntelliJ IDEA Community Edition 2016.1.3libidea_rt.jar' com.intellij.rt.execution.application.AppMain ThreadedSortingComparsionarray size: 10000002016-07-15 13:45:22Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.45-b02 mixed mode):'pool-1-thread-4' #15 prio=5 os_prio=0 tid=0x00000000696bd000 nid=0x560 runnable [0x00000002fffee000] java.lang.Thread.State: RUNNABLE at ThreadedSortingComparsion.mergeSort(ThreadedSortingComparsion.java:77) at ThreadedSortingComparsion.mergeSort(ThreadedSortingComparsion.java:78) at ThreadedSortingComparsion.mergeSort(ThreadedSortingComparsion.java:78) at ThreadedSortingComparsion.mergeSort(ThreadedSortingComparsion.java:78) at ThreadedSortingComparsion.mergeSort(ThreadedSortingComparsion.java:77) at ThreadedSortingComparsion$$Lambda$5/81628611.sort(Unknown Source) at ThreadedSortingComparsion.lambda$measureTime$0(ThreadedSortingComparsion.java:21) at ThreadedSortingComparsion$$Lambda$2/1023892928.call(Unknown Source) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745)'pool-1-thread-3' #14 prio=5 os_prio=0 tid=0x00000000696bb800 nid=0x2634 runnable [0x00000002bffee000] java.lang.Thread.State: RUNNABLE at ThreadedSortingComparsion.quickSort(ThreadedSortingComparsion.java:123) at ThreadedSortingComparsion.quickSort(ThreadedSortingComparsion.java:126) at ThreadedSortingComparsion.quickSort(ThreadedSortingComparsion.java:123) at ThreadedSortingComparsion.quickSort(ThreadedSortingComparsion.java:126) at ThreadedSortingComparsion.quickSort(ThreadedSortingComparsion.java:126) at ThreadedSortingComparsion.quickSort(ThreadedSortingComparsion.java:123) at ThreadedSortingComparsion.quickSort(ThreadedSortingComparsion.java:123) at ThreadedSortingComparsion.quickSort(ThreadedSortingComparsion.java:123) at ThreadedSortingComparsion.quickSort(ThreadedSortingComparsion.java:123) at ThreadedSortingComparsion.quickSort(ThreadedSortingComparsion.java:123) at ThreadedSortingComparsion.quickSort(ThreadedSortingComparsion.java:123) at ThreadedSortingComparsion.quickSort(ThreadedSortingComparsion.java:123) at ThreadedSortingComparsion.quickSort(ThreadedSortingComparsion.java:123) at ThreadedSortingComparsion.quickSort(ThreadedSortingComparsion.java:123) at ThreadedSortingComparsion.quickSort(ThreadedSortingComparsion.java:123) at ThreadedSortingComparsion.quickSort(ThreadedSortingComparsion.java:126) at ThreadedSortingComparsion.quickSort(ThreadedSortingComparsion.java:123) at ThreadedSortingComparsion.quickSort(ThreadedSortingComparsion.java:123) at ThreadedSortingComparsion.quickSort(ThreadedSortingComparsion.java:126) at ThreadedSortingComparsion.quickSort(ThreadedSortingComparsion.java:123) at ThreadedSortingComparsion.quickSort(ThreadedSortingComparsion.java:126) at ThreadedSortingComparsion.quickSort(ThreadedSortingComparsion.java:126) at ThreadedSortingComparsion.quickSort(ThreadedSortingComparsion.java:123) at ThreadedSortingComparsion.quickSort(ThreadedSortingComparsion.java:126) at ThreadedSortingComparsion.quickSort(ThreadedSortingComparsion.java:126) at ThreadedSortingComparsion.quickSort(ThreadedSortingComparsion.java:123) at ThreadedSortingComparsion.quickSort(ThreadedSortingComparsion.java:126) at ThreadedSortingComparsion.quickSort(ThreadedSortingComparsion.java:126) at ThreadedSortingComparsion.quickSort(ThreadedSortingComparsion.java:126) at ThreadedSortingComparsion.quickSort(ThreadedSortingComparsion.java:105) at ThreadedSortingComparsion$$Lambda$4/1989780873.sort(Unknown Source) at ThreadedSortingComparsion.lambda$measureTime$0(ThreadedSortingComparsion.java:21) at ThreadedSortingComparsion$$Lambda$2/1023892928.call(Unknown Source) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745)'pool-1-thread-2' #13 prio=5 os_prio=0 tid=0x00000000696b7800 nid=0x1c70 waiting on condition [0x000000027ffef000] java.lang.Thread.State: WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for <0x0000000719d72480> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745)'pool-1-thread-1' #12 prio=5 os_prio=0 tid=0x00000000696b6800 nid=0x478 runnable [0x000000023ffee000] java.lang.Thread.State: RUNNABLE at ThreadedSortingComparsion.bubbleSort(ThreadedSortingComparsion.java:139) at ThreadedSortingComparsion$$Lambda$1/990368553.sort(Unknown Source) at ThreadedSortingComparsion.lambda$measureTime$0(ThreadedSortingComparsion.java:21) at ThreadedSortingComparsion$$Lambda$2/1023892928.call(Unknown Source) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745)'Monitor Ctrl-Break' #11 daemon prio=5 os_prio=0 tid=0x0000000068d3d000 nid=0x2f3c runnable [0x00000001fffee000] java.lang.Thread.State: RUNNABLE at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.socketRead(SocketInputStream.java:116) at java.net.SocketInputStream.read(SocketInputStream.java:170) at java.net.SocketInputStream.read(SocketInputStream.java:141) at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284) at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326) at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178) - locked <0x00000007156892b8> (a java.io.InputStreamReader) at java.io.InputStreamReader.read(InputStreamReader.java:184) at java.io.BufferedReader.fill(BufferedReader.java:161) at java.io.BufferedReader.readLine(BufferedReader.java:324) - locked <0x00000007156892b8> (a java.io.InputStreamReader) at java.io.BufferedReader.readLine(BufferedReader.java:389) at com.intellij.rt.execution.application.AppMain$1.run(AppMain.java:93) at java.lang.Thread.run(Thread.java:745)'Service Thread' #10 daemon prio=9 os_prio=0 tid=0x0000000068c81000 nid=0x2d6c runnable [0x0000000000000000] java.lang.Thread.State: RUNNABLE'C1 CompilerThread3' #9 daemon prio=9 os_prio=2 tid=0x0000000068bea800 nid=0x1ad0 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE'C2 CompilerThread2' #8 daemon prio=9 os_prio=2 tid=0x0000000068be4000 nid=0x17d0 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE'C2 CompilerThread1' #7 daemon prio=9 os_prio=2 tid=0x0000000068bdd800 nid=0x3238 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE'C2 CompilerThread0' #6 daemon prio=9 os_prio=2 tid=0x0000000068bda000 nid=0x1824 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE'Attach Listener' #5 daemon prio=5 os_prio=2 tid=0x0000000068bd8800 nid=0x910 runnable [0x0000000000000000] java.lang.Thread.State: RUNNABLE'Signal Dispatcher' #4 daemon prio=9 os_prio=2 tid=0x0000000068bd7800 nid=0x31f8 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE'Finalizer' #3 daemon prio=8 os_prio=1 tid=0x0000000043229800 nid=0x2810 in Object.wait() [0x00000000fffee000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x0000000719d707e0> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143) - locked <0x0000000719d707e0> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164) at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)'Reference Handler' #2 daemon prio=10 os_prio=2 tid=0x0000000043223000 nid=0xd48 in Object.wait() [0x00000000bffef000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x0000000719d78370> (a java.lang.ref.Reference$Lock) at java.lang.Object.wait(Object.java:502) at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:157) - locked <0x0000000719d78370> (a java.lang.ref.Reference$Lock)'main' #1 prio=5 os_prio=0 tid=0x000000000311d800 nid=0x2ed0 waiting on condition [0x000000004311e000] java.lang.Thread.State: WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for <0x0000000719d58fe0> (a java.util.concurrent.FutureTask) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) at java.util.concurrent.FutureTask.awaitDone(FutureTask.java:429) at java.util.concurrent.FutureTask.get(FutureTask.java:191) at ThreadedSortingComparsion.start(ThreadedSortingComparsion.java:48) at ThreadedSortingComparsion.main(ThreadedSortingComparsion.java:162) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)'VM Thread' os_prio=2 tid=0x0000000056348800 nid=0x2984 runnable'GC task thread#0 (ParallelGC)' os_prio=0 tid=0x0000000043147000 nid=0x27e0 runnable'GC task thread#1 (ParallelGC)' os_prio=0 tid=0x0000000043148800 nid=0x20b4 runnable'GC task thread#2 (ParallelGC)' os_prio=0 tid=0x000000004314a000 nid=0x1da4 runnable'GC task thread#3 (ParallelGC)' os_prio=0 tid=0x000000004314c000 nid=0x29e0 runnable'GC task thread#4 (ParallelGC)' os_prio=0 tid=0x000000004314e000 nid=0xa04 runnable'GC task thread#5 (ParallelGC)' os_prio=0 tid=0x0000000043150000 nid=0x14b8 runnable'GC task thread#6 (ParallelGC)' os_prio=0 tid=0x0000000043153800 nid=0xf00 runnable'GC task thread#7 (ParallelGC)' os_prio=0 tid=0x0000000043154800 nid=0x243c runnable'VM Periodic Task Thread' os_prio=2 tid=0x0000000068c82000 nid=0x22d8 waiting on conditionJNI global references: 224Heap PSYoungGen total 76288K,used 13755K [0x0000000715580000,0x000000071aa80000,0x00000007c0000000) eden space 65536K,4% used [0x0000000715580000,0x0000000715874910,0x0000000719580000) from space 10752K,99% used [0x0000000719580000,0x0000000719ffa348,0x000000071a000000) to space 10752K,0% used [0x000000071a000000,0x000000071a000000,0x000000071aa80000) ParOldGen total 175104K,used 33211K [0x00000005c0000000,0x00000005cab00000,0x0000000715580000) object space 175104K,18% used [0x00000005c0000000,0x00000005c206ed30,0x00000005cab00000) Metaspace used 4277K,capacity 4790K,committed 4992K,reserved 1056768K class space used 484K,capacity 535K,committed 640K,reserved 1048576Kquick sort: 355.579434803smerge sort: 355.629940032sinsertion sort: 355.532578023s
相關(guān)文章:
1. mysql - 這條聯(lián)合sql語句哪里錯了2. webpack - vuejs+java前后臺分離實現(xiàn)及部署問題3. docker容器呢SSH為什么連不通呢?4. docker鏡像push報錯5. python - 用Mac自帶的Apache服務(wù)器開發(fā)CGI,在瀏覽器直接輸出純文本了?求解6. 網(wǎng)站在移動的環(huán)境下手機(jī),pc打不開7. javascript - echart+百度地圖8. python - 速度最快的啟動界面GUI9. python - flask sqlalchemy signals 無法觸發(fā)10. mysqldb - MAC OS安裝MySQL-python總是失敗,請幫忙看看什么原因?
