Repository: crossoverJie/JCSprout Branch: master Commit: fc4c6e5f6d17 Files: 221 Total size: 15.7 MB Directory structure: gitextract_c7550992/ ├── .github/ │ ├── ISSUE_TEMPLATE │ └── PULL_REQUEST_TEMPLATE ├── .travis.yml ├── 79884.log ├── LICENSE ├── MD/ │ ├── ArrayList.md │ ├── Cache-design.md │ ├── ClassLoad.md │ ├── ConcurrentHashMap.md │ ├── Consistent-Hash.md │ ├── DB-split.md │ ├── GarbageCollection.md │ ├── HashMap.md │ ├── ID-generator.md │ ├── Java-lock.md │ ├── Limiting.md │ ├── LinkedList.md │ ├── MemoryAllocation.md │ ├── MySQL-Index.md │ ├── OOM-analysis.md │ ├── ReentrantLock.md │ ├── SQL-optimization.md │ ├── Spike.md │ ├── SpringAOP.md │ ├── Synchronize.md │ ├── TCP-IP.md │ ├── Thread-common-problem.md │ ├── ThreadPoolExecutor.md │ ├── Threadcore.md │ ├── additional-skills/ │ │ └── how-to-use-git-efficiently.md │ ├── architecture-design/ │ │ └── million-sms-push.md │ ├── collection/ │ │ ├── HashSet.md │ │ └── LinkedHashMap.md │ ├── concurrent/ │ │ ├── thread-communication.md │ │ └── volatile.md │ ├── distributed/ │ │ ├── Distributed-Limit.md │ │ └── distributed-lock-redis.md │ ├── jvm/ │ │ └── OOM-Disruptor.md │ ├── kafka/ │ │ └── kafka-product.md │ ├── newObject.md │ ├── soft-skills/ │ │ ├── Interview-experience.md │ │ └── how-to-be-developer.md │ ├── spring/ │ │ └── spring-bean-lifecycle.md │ └── third-party-component/ │ ├── cicada.md │ ├── guava-cache.md │ └── seconds-kill.md ├── README.md ├── docs/ │ ├── .nojekyll │ ├── README.md │ ├── _coverpage.md │ ├── _sidebar.md │ ├── algorithm/ │ │ ├── Consistent-Hash.md │ │ ├── LRU-cache.md │ │ ├── Limiting.md │ │ ├── common-algorithm.md │ │ ├── consistent-hash-implement.md │ │ └── guava-bloom-filter.md │ ├── architecture-design/ │ │ ├── Spike.md │ │ ├── million-sms-push.md │ │ └── seconds-kill.md │ ├── collections/ │ │ ├── ArrayList.md │ │ ├── HashMap.md │ │ ├── HashSet.md │ │ ├── LinkedHashMap.md │ │ └── LinkedList.md │ ├── contactme.md │ ├── db/ │ │ ├── DB-split.md │ │ ├── MySQL-Index.md │ │ ├── SQL-optimization.md │ │ └── sharding-db.md │ ├── distributed/ │ │ ├── Cache-design.md │ │ ├── Distributed-Limit.md │ │ ├── ID-generator.md │ │ └── distributed-lock-redis.md │ ├── frame/ │ │ ├── SpringAOP.md │ │ ├── guava-cache.md │ │ ├── kafka-consumer.md │ │ ├── kafka-product.md │ │ └── spring-bean-lifecycle.md │ ├── index.html │ ├── jvm/ │ │ ├── ClassLoad.md │ │ ├── GarbageCollection.md │ │ ├── JVM-concurrent-HashSet-problem.md │ │ ├── MemoryAllocation.md │ │ ├── OOM-Disruptor.md │ │ ├── OOM-analysis.md │ │ ├── cpu-percent-100.md │ │ ├── newObject.md │ │ └── volatile.md │ ├── netty/ │ │ ├── Netty(1)TCP-Heartbeat.md │ │ ├── Netty(2)Thread-model.md │ │ ├── cicada.md │ │ └── cim.md │ ├── soft-skills/ │ │ ├── Interview-experience.md │ │ ├── TCP-IP.md │ │ ├── how-to-be-developer.md │ │ └── how-to-use-git-efficiently.md │ └── thread/ │ ├── ArrayBlockingQueue.md │ ├── ConcurrentHashMap.md │ ├── Java-lock.md │ ├── ReentrantLock.md │ ├── Synchronize.md │ ├── Thread-common-problem.md │ ├── ThreadPoolExecutor.md │ ├── Threadcore.md │ ├── thread-communication.md │ ├── thread-gone.md │ └── thread-gone2.md ├── java_pid26365.hprof ├── pom.xml └── src/ ├── main/ │ ├── java/ │ │ └── com/ │ │ └── crossoverjie/ │ │ ├── Application.java │ │ ├── actual/ │ │ │ ├── FourThreadPrinter.java │ │ │ ├── LRUAbstractMap.java │ │ │ ├── LRULinkedMap.java │ │ │ ├── LRUMap.java │ │ │ ├── NotifyAll.java │ │ │ ├── ReadFile.java │ │ │ ├── Search.java │ │ │ ├── ThreadCommunication.java │ │ │ ├── TwoThread.java │ │ │ ├── TwoThreadNonBlocking.java │ │ │ ├── TwoThreadWaitNotify.java │ │ │ └── TwoThreadWaitNotifySimple.java │ │ ├── algorithm/ │ │ │ ├── ArrayKShift.java │ │ │ ├── BinaryNode.java │ │ │ ├── BinaryNodeTravel.java │ │ │ ├── BloomFilters.java │ │ │ ├── HappyNum.java │ │ │ ├── LinkLoop.java │ │ │ ├── LinkedListMergeSort.java │ │ │ ├── MergeTwoSortedLists.java │ │ │ ├── ReverseNode.java │ │ │ ├── TwoArray.java │ │ │ ├── TwoStackQueue.java │ │ │ └── TwoSum.java │ │ ├── basic/ │ │ │ ├── CollectionsTest.java │ │ │ ├── HashMapTest.java │ │ │ └── StringTest.java │ │ ├── classloader/ │ │ │ ├── ChildClass.java │ │ │ ├── Main.java │ │ │ └── SuperClass.java │ │ ├── concurrent/ │ │ │ ├── ArrayQueue.java │ │ │ ├── CustomThreadPool.java │ │ │ ├── Singleton.java │ │ │ ├── StopThread.java │ │ │ ├── ThreadState.java │ │ │ ├── Volatile.java │ │ │ ├── VolatileInc.java │ │ │ ├── communication/ │ │ │ │ ├── MultipleThreadCountDownKit.java │ │ │ │ └── Notify.java │ │ │ └── future/ │ │ │ ├── Callable.java │ │ │ ├── Future.java │ │ │ └── FutureTask.java │ │ ├── design/ │ │ │ └── pattern/ │ │ │ ├── chainofresponsibility/ │ │ │ │ ├── Main.java │ │ │ │ ├── MsgProcessChain.java │ │ │ │ ├── Process.java │ │ │ │ └── impl/ │ │ │ │ ├── CopyrightProcess.java │ │ │ │ ├── SensitiveWordProcess.java │ │ │ │ └── TypoProcess.java │ │ │ └── factorymethod/ │ │ │ ├── Animal.java │ │ │ ├── AnimalFactory.java │ │ │ ├── Cat.java │ │ │ ├── CatFactory.java │ │ │ ├── Fish.java │ │ │ ├── FishFactory.java │ │ │ └── Main.java │ │ ├── disruptor/ │ │ │ ├── LongEvent.java │ │ │ ├── LongEventFactory.java │ │ │ ├── LongEventHandler.java │ │ │ ├── LongEventMain.java │ │ │ └── LongEventProducer.java │ │ ├── gc/ │ │ │ └── MinorGC.java │ │ ├── guava/ │ │ │ ├── CacheLoaderTest.java │ │ │ └── callback/ │ │ │ ├── CallBackListener.java │ │ │ ├── Caller.java │ │ │ ├── Main.java │ │ │ └── Notifier.java │ │ ├── hystrix/ │ │ │ ├── CommandOrder.java │ │ │ ├── CommandTest.java │ │ │ └── CommandUser.java │ │ ├── oom/ │ │ │ └── heap/ │ │ │ ├── HeapOOM.java │ │ │ └── MetaSpaceOOM.java │ │ ├── proxy/ │ │ │ ├── cglib/ │ │ │ │ ├── RealSubject.java │ │ │ │ └── RealSubjectIntercept.java │ │ │ └── jdk/ │ │ │ ├── CustomizeHandle.java │ │ │ ├── ISubject.java │ │ │ └── impl/ │ │ │ └── ISubjectImpl.java │ │ ├── red/ │ │ │ └── RedPacket.java │ │ ├── spring/ │ │ │ ├── LifeCycleConfig.java │ │ │ ├── SpringLifeCycle.java │ │ │ ├── annotation/ │ │ │ │ └── AnnotationBean.java │ │ │ ├── aware/ │ │ │ │ └── SpringLifeCycleAware.java │ │ │ ├── processor/ │ │ │ │ └── SpringLifeCycleProcessor.java │ │ │ └── service/ │ │ │ └── SpringLifeCycleService.java │ │ ├── synchronize/ │ │ │ └── Synchronize.java │ │ └── thread/ │ │ └── ThreadExceptionTest.java │ └── resources/ │ ├── application.properties │ └── logback.xml └── test/ └── java/ └── com/ └── crossoverjie/ ├── actual/ │ ├── AbstractMapTest.java │ ├── LRULinkedMapTest.java │ └── LRUMapTest.java ├── algorithm/ │ ├── BinaryNodeTest.java │ ├── BinaryNodeTravelTest.java │ ├── BloomFiltersTest.java │ ├── HappyNumTest.java │ ├── LinkLoopTest.java │ ├── LinkedListMergeSortTest.java │ ├── MergeTwoSortedListsTest.java │ ├── ReverseNodeTest.java │ ├── TwoStackQueueTest.java │ └── TwoSumTest.java ├── concurrent/ │ ├── ArrayQueueTest.java │ ├── CustomThreadPoolExeceptionTest.java │ ├── CustomThreadPoolFutureTest.java │ ├── CustomThreadPoolTest.java │ ├── MultipleThreadCountDownKitTest.java │ └── ThreadPoolTest.java ├── kafka/ │ └── KafkaTest.java ├── proxy/ │ └── JDKProxyTest.java ├── red/ │ └── RedPacketTest.java └── reference/ └── ReferenceTest.java ================================================ FILE CONTENTS ================================================ ================================================ FILE: .github/ISSUE_TEMPLATE ================================================ **在提交issue之前请回答以下问题,谢谢!** > 建议首先查看是否已经有类似的 Issues (提交时可删除该提示) ### 你使用的是哪个版本 ### 预期结果 ### 实际结果 ### 重现结果的步骤 ### 其他相关信息 ================================================ FILE: .github/PULL_REQUEST_TEMPLATE ================================================ 如果是文字类 PR,请按照 [中文排版指北](https://github.com/sparanoid/chinese-copywriting-guidelines) 进行编写(提交时可删除该提示)。 **What kind of change does this PR introduce?** (check at least one) - [ ] Bugfix - [ ] Feature - [ ] Code style update - [ ] Refactor - [ ] Build-related changes - [ ] Other, please describe: **The description of the PR:** **Other information:** ================================================ FILE: .travis.yml ================================================ language: java install: mvn install -DskipTests=true -Dmaven.javadoc.skip=true script: mvn -DskipTests=true clean install branches: only: - master ================================================ FILE: 79884.log ================================================ 2018-03-06 23:11:05 Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.131-b11 mixed mode): "Attach Listener" #15 daemon prio=9 os_prio=31 tid=0x00007ffd7b08b800 nid=0x1407 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE "DestroyJavaVM" #14 prio=5 os_prio=31 tid=0x00007ffd7b001800 nid=0x1c03 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE "Blocked2" #13 prio=5 os_prio=31 tid=0x00007ffd7b08b000 nid=0x5503 waiting for monitor entry [0x00007000083d1000] java.lang.Thread.State: BLOCKED (on object monitor) at com.crossoverjie.thread.ThreadState$Blocked.run(ThreadState.java:59) - waiting to lock <0x000000079576cd60> (a java.lang.Class for com.crossoverjie.thread.ThreadState$Blocked) at java.lang.Thread.run(Thread.java:748) "Blocked1" #12 prio=5 os_prio=31 tid=0x00007ffd7b08a000 nid=0x5303 waiting on condition [0x00007000082ce000] java.lang.Thread.State: TIMED_WAITING (sleeping) at java.lang.Thread.sleep(Native Method) at com.crossoverjie.thread.ThreadState$Blocked.run(ThreadState.java:59) - locked <0x000000079576cd60> (a java.lang.Class for com.crossoverjie.thread.ThreadState$Blocked) at java.lang.Thread.run(Thread.java:748) "Waiting" #11 prio=5 os_prio=31 tid=0x00007ffd7b089800 nid=0x5103 in Object.wait() [0x00007000081cb000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x0000000795768db0> (a java.lang.Class for com.crossoverjie.thread.ThreadState$Waiting) at java.lang.Object.wait(Object.java:502) at com.crossoverjie.thread.ThreadState$Waiting.run(ThreadState.java:42) - locked <0x0000000795768db0> (a java.lang.Class for com.crossoverjie.thread.ThreadState$Waiting) at java.lang.Thread.run(Thread.java:748) "TimeWaiting" #10 prio=5 os_prio=31 tid=0x00007ffd7b82c800 nid=0x4f03 waiting on condition [0x00007000080c8000] java.lang.Thread.State: TIMED_WAITING (sleeping) at java.lang.Thread.sleep(Native Method) at com.crossoverjie.thread.ThreadState$TimeWaiting.run(ThreadState.java:27) at java.lang.Thread.run(Thread.java:748) "Monitor Ctrl-Break" #9 daemon prio=5 os_prio=31 tid=0x00007ffd7a97e000 nid=0x4d03 runnable [0x0000700007fc5000] java.lang.Thread.State: RUNNABLE at java.net.PlainSocketImpl.socketAccept(Native Method) at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:409) at java.net.ServerSocket.implAccept(ServerSocket.java:545) at java.net.ServerSocket.accept(ServerSocket.java:513) at com.intellij.rt.execution.application.AppMain$1.run(AppMain.java:79) at java.lang.Thread.run(Thread.java:748) "Service Thread" #8 daemon prio=9 os_prio=31 tid=0x00007ffd7a837800 nid=0x4903 runnable [0x0000000000000000] java.lang.Thread.State: RUNNABLE "C1 CompilerThread2" #7 daemon prio=9 os_prio=31 tid=0x00007ffd7b030800 nid=0x4703 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE "C2 CompilerThread1" #6 daemon prio=9 os_prio=31 tid=0x00007ffd7b029800 nid=0x4503 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE "C2 CompilerThread0" #5 daemon prio=9 os_prio=31 tid=0x00007ffd7a813800 nid=0x4303 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE "Signal Dispatcher" #4 daemon prio=9 os_prio=31 tid=0x00007ffd7a839000 nid=0x4103 runnable [0x0000000000000000] java.lang.Thread.State: RUNNABLE "Finalizer" #3 daemon prio=8 os_prio=31 tid=0x00007ffd7b00b800 nid=0x3103 in Object.wait() [0x00007000078b0000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x0000000795588ec8> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143) - locked <0x0000000795588ec8> (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=0x00007ffd7a800800 nid=0x2f03 in Object.wait() [0x00007000077ad000] 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 Thread" os_prio=31 tid=0x00007ffd7a01a800 nid=0x2d03 runnable "GC task thread#0 (ParallelGC)" os_prio=31 tid=0x00007ffd7b005800 nid=0x2503 runnable "GC task thread#1 (ParallelGC)" os_prio=31 tid=0x00007ffd7b006000 nid=0x2703 runnable "GC task thread#2 (ParallelGC)" os_prio=31 tid=0x00007ffd7b006800 nid=0x2903 runnable "GC task thread#3 (ParallelGC)" os_prio=31 tid=0x00007ffd7b808000 nid=0x2b03 runnable "VM Periodic Task Thread" os_prio=31 tid=0x00007ffd7a03e000 nid=0x4b03 waiting on condition JNI global references: 21 ================================================ FILE: LICENSE ================================================ MIT License Copyright (c) 2017 crossoverJie Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: MD/ArrayList.md ================================================ # ArrayList/Vector 的底层分析 ## ArrayList `ArrayList` 实现于 `List`、`RandomAccess` 接口。可以插入空数据,也支持随机访问。 `ArrayList `相当于动态数据,其中最重要的两个属性分别是: `elementData` 数组,以及 `size` 大小。 在调用 `add()` 方法的时候: ```java public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; } ``` - 首先进行扩容校验。 - 将插入的值放到尾部,并将 size + 1 。 如果是调用 `add(index,e)` 在指定位置添加的话: ```java public void add(int index, E element) { rangeCheckForAdd(index); ensureCapacityInternal(size + 1); // Increments modCount!! //复制,向后移动 System.arraycopy(elementData, index, elementData, index + 1, size - index); elementData[index] = element; size++; } ``` - 也是首先扩容校验。 - 接着对数据进行复制,目的是把 index 位置空出来放本次插入的数据,并将后面的数据向后移动一个位置。 其实扩容最终调用的代码: ```java private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); } ``` 也是一个数组复制的过程。 由此可见 `ArrayList` 的主要消耗是数组扩容以及在指定位置添加数据,在日常使用时最好是指定大小,尽量减少扩容。更要减少在指定位置插入数据的操作。 ### 序列化 由于 ArrayList 是基于动态数组实现的,所以并不是所有的空间都被使用。因此使用了 `transient` 修饰,可以防止被自动序列化。 ```java transient Object[] elementData; ``` 因此 ArrayList 自定义了序列化与反序列化: ```java private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException{ // Write out element count, and any hidden stuff int expectedModCount = modCount; s.defaultWriteObject(); // Write out size as capacity for behavioural compatibility with clone() s.writeInt(size); // Write out all elements in the proper order. //只序列化了被使用的数据 for (int i=0; i