"T2" #11 prio=5 os_prio=31 tid=0x00007f837c8ed000 nid=0x3e03 waiting for monitor entry [0x0000700003f70000] java.lang.Thread.State: BLOCKED (on object monitor) at com.hardydou.jmm.DeadLock.doSomeThing(DeadLock.java:29) - waiting to lock <0x000000079570f7d0> (a java.lang.String) - locked <0x000000079570f800> (a java.lang.String) at com.hardydou.jmm.DeadLock.run(DeadLock.java:37)
"T1" #10 prio=5 os_prio=31 tid=0x00007f837c858000 nid=0x3c03 waiting for monitor entry [0x0000700003e6d000] java.lang.Thread.State: BLOCKED (on object monitor) at com.hardydou.jmm.DeadLock.doSomeThing(DeadLock.java:29) - waiting to lock <0x000000079570f800> (a java.lang.String) - locked <0x000000079570f7d0> (a java.lang.String) at com.hardydou.jmm.DeadLock.run(DeadLock.java:37)
"Monitor Ctrl-Break" #5 daemon prio=5 os_prio=31 tid=0x00007f837d01e800 nid=0x4903 runnable [0x000070000385b000] 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:171) 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 <0x00000007957af218> (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 <0x00000007957af218> (a java.io.InputStreamReader) at java.io.BufferedReader.readLine(BufferedReader.java:389) at com.intellij.rt.execution.application.AppMainV2$1.run(AppMainV2.java:64)
"Finalizer" #3 daemon prio=8 os_prio=31 tid=0x00007f837c842800 nid=0x2f03 in Object.wait() [0x0000700003655000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x0000000795588ec0> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143) - locked <0x0000000795588ec0> (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=31 tid=0x00007f837c016000 nid=0x5203 in Object.wait() [0x0000700003552000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x0000000795586b68> (a java.lang.ref.Reference$Lock) at java.lang.Object.wait(Object.java:502) at java.lang.ref.Reference.tryHandlePending(Reference.java:191) - locked <0x0000000795586b68> (a java.lang.ref.Reference$Lock) at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)
"VM Periodic Task Thread" os_prio=31 tid=0x00007f837d042000 nid=0x4303 waiting on condition
JNI global references: 33
Found one Java-level deadlock: ============================= "T2": waiting to lock monitor 0x00007f837c01c0a8 (object 0x000000079570f7d0, a java.lang.String), which is held by "T1" "T1": waiting to lock monitor 0x00007f837c0196b8 (object 0x000000079570f800, a java.lang.String), which is held by "T2"
Java stack information for the threads listed above: =================================================== "T2": at com.hardydou.jmm.DeadLock.doSomeThing(DeadLock.java:29) - waiting to lock <0x000000079570f7d0> (a java.lang.String) - locked <0x000000079570f800> (a java.lang.String) at com.hardydou.jmm.DeadLock.run(DeadLock.java:37) "T1": at com.hardydou.jmm.DeadLock.doSomeThing(DeadLock.java:29) - waiting to lock <0x000000079570f800> (a java.lang.String) - locked <0x000000079570f7d0> (a java.lang.String) at com.hardydou.jmm.DeadLock.run(DeadLock.java:37)
Found 1 deadlock.
Heap PSYoungGen total 38400K, used 7323K [0x0000000795580000, 0x0000000798000000, 0x00000007c0000000) eden space 33280K, 22% used [0x0000000795580000,0x0000000795ca6e80,0x0000000797600000) from space 5120K, 0% used [0x0000000797b00000,0x0000000797b00000,0x0000000798000000) to space 5120K, 0% used [0x0000000797600000,0x0000000797600000,0x0000000797b00000) ParOldGen total 87552K, used 0K [0x0000000740000000, 0x0000000745580000, 0x0000000795580000) object space 87552K, 0% used [0x0000000740000000,0x0000000740000000,0x0000000745580000) Metaspace used 3818K, capacity 4540K, committed 4864K, reserved 1056768K class space used 423K, capacity 428K, committed 512K, reserved 1048576K
Process finished with exit code 137 (interrupted by signal 9: SIGKILL)
"T2" #11 prio=5 os_prio=31 tid=0x00007fed8a0ed800 nid=0x3d03 waiting for monitor entry [0x000070000acde000] java.lang.Thread.State: BLOCKED (on object monitor) at com.hardydou.jmm.DeadLock.doSomeThing(DeadLock.java:29) - waiting to lock <0x000000079570f8d8> (a java.lang.String) - locked <0x000000079570f908> (a java.lang.String) at com.hardydou.jmm.DeadLock.run(DeadLock.java:37)
Locked ownable synchronizers: - None
"T1" #10 prio=5 os_prio=31 tid=0x00007fed8a0ed000 nid=0x4303 waiting for monitor entry [0x000070000abdb000] java.lang.Thread.State: BLOCKED (on object monitor) at com.hardydou.jmm.DeadLock.doSomeThing(DeadLock.java:29) - waiting to lock <0x000000079570f908> (a java.lang.String) - locked <0x000000079570f8d8> (a java.lang.String) at com.hardydou.jmm.DeadLock.run(DeadLock.java:37)
"Monitor Ctrl-Break" #5 daemon prio=5 os_prio=31 tid=0x00007fed8981c800 nid=0x4903 runnable [0x000070000a5c9000] 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:171) 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 <0x00000007957af110> (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 <0x00000007957af110> (a java.io.InputStreamReader) at java.io.BufferedReader.readLine(BufferedReader.java:389) at com.intellij.rt.execution.application.AppMainV2$1.run(AppMainV2.java:64)
"Finalizer" #3 daemon prio=8 os_prio=31 tid=0x00007fed89807800 nid=0x5003 in Object.wait() [0x000070000a3c3000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x0000000795588ec0> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143) - locked <0x0000000795588ec0> (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)
Locked ownable synchronizers: - None
"Reference Handler" #2 daemon prio=10 os_prio=31 tid=0x00007fed8900c800 nid=0x2d03 in Object.wait() [0x000070000a2c0000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x0000000795586b68> (a java.lang.ref.Reference$Lock) at java.lang.Object.wait(Object.java:502) at java.lang.ref.Reference.tryHandlePending(Reference.java:191) - locked <0x0000000795586b68> (a java.lang.ref.Reference$Lock) at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)
Heap PSYoungGen total 18944K, used 1524K [0x00000007beb00000, 0x00000007c0000000, 0x00000007c0000000) eden space 16384K, 9% used [0x00000007beb00000,0x00000007bec7d110,0x00000007bfb00000) from space 2560K, 0% used [0x00000007bfb00000,0x00000007bfb00000,0x00000007bfd80000) to space 2560K, 0% used [0x00000007bfd80000,0x00000007bfd80000,0x00000007c0000000) ParOldGen total 44032K, used 795K [0x00000007bc000000, 0x00000007beb00000, 0x00000007beb00000) object space 44032K, 1% used [0x00000007bc000000,0x00000007bc0c6e20,0x00000007beb00000) Metaspace used 5370K, capacity 5488K, committed 5632K, reserved 1056768K class space used 619K, capacity 656K, committed 768K, reserved 1048576K
可作为GC Roots的节点主要在全局性的引用(常量、类静态属性)与上下文(栈帧中的本地变量)中。GC停顿:gc执行时所有Java执行线程必须停顿(Stop The World)。即时在号称(几乎)不会发生停顿的CMS收集器中,枚举根节点时也是必须要停顿的。
准确式GC:Jvm知道内存中某个位置数据是什么类型,不用扫描就可以快速找到对象引用的位置。
最基本、最悠久收集器,曾经(dk1.3.1之前)是新生代唯一选择。单线程的收集器(Stop The World),执行它必须停止所有线程。
图示:
Stop The World 体验非常差劲,从JDK1.3开始,一直到现在的Jdk1.8 ,HotSpot虚拟机团队为消除或者减少工作线程因为内存回收而导致停顿的努力一直在进行着。从Serial收集器——>Paraller收集器——>Concurrent Mark Sweep(CMS)——>最前沿的G1收集器,越来越复杂,停顿不断再缩短,但还没有办法完全消除。
Serial收集器特点以及应用:
简单高效
Client模式下很好选择
ParNew收集器
Serial收集器多线程版本,除了多线程外其余(例如:-XX:SurvivorRation-XX:pretenureSizeThread-XX:HandlePromotionFailure 等)、收集算法、Stop The World 、对象分配规则、回收策略都与Serial完全一样。
泛型针对引用有效。 List<String> strList1 = new ArrayList();//有效果(阿里巴巴规范也提倡这么写) List<String> strList2 = new ArrayList<String>();//效果同上面 List strList3 = new ArrayList<String>();//无效果
@SupportedAnnotationTypes({"com.hardydou.learn.annotation.processor.EnableAuthor"}) public class AuthorProcessor extends AbstractProcessor { @Override public SourceVersion getSupportedSourceVersion() { return SourceVersion.latestSupported(); }
@Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { Set<? extends Element> elements = roundEnv.getElementsAnnotatedWith(EnableAuthor.class);