增加JVM相关问题

pull/6/head
yuanguangxin 5 years ago
parent 99d019fad8
commit 0c5a455d64

@ -263,7 +263,7 @@
<workItem from="1582007077483" duration="2054000" />
<workItem from="1582286924766" duration="554000" />
<workItem from="1582552791282" duration="3963000" />
<workItem from="1582634245000" duration="6844000" />
<workItem from="1582634245000" duration="7244000" />
</task>
<task id="LOCAL-00001" summary="add q5/q7/q172">
<created>1580045439607</created>
@ -517,7 +517,14 @@
<option name="project" value="LOCAL" />
<updated>1582643176570</updated>
</task>
<option name="localTasksCounter" value="37" />
<task id="LOCAL-00037" summary="增加操作系统相关问题">
<created>1582708681247</created>
<option name="number" value="00037" />
<option name="presentableId" value="LOCAL-00037" />
<option name="project" value="LOCAL" />
<updated>1582708681248</updated>
</task>
<option name="localTasksCounter" value="38" />
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
@ -570,7 +577,6 @@
</option>
</component>
<component name="VcsManagerConfiguration">
<MESSAGE value="add q5/q7/q172" />
<MESSAGE value="add q9" />
<MESSAGE value="add q3/q8/q11" />
<MESSAGE value="add q6" />
@ -595,7 +601,8 @@
<MESSAGE value="update Rocket.md" />
<MESSAGE value="add q73/q102/q118/q224" />
<MESSAGE value="add q736" />
<option name="LAST_COMMIT_MESSAGE" value="add q736" />
<MESSAGE value="增加操作系统相关问题" />
<option name="LAST_COMMIT_MESSAGE" value="增加操作系统相关问题" />
</component>
<component name="WindowStateProjectService">
<state x="320" y="115" key="#Inspections" timestamp="1581061018990">
@ -610,10 +617,10 @@
<screen x="0" y="0" width="1440" height="900" />
</state>
<state x="533" y="166" key="#com.intellij.ide.util.MemberChooser/0.0.1440.900@0.0.1440.900" timestamp="1578548165321" />
<state x="303" y="50" key="CommitChangelistDialog2" timestamp="1582643176324">
<state x="303" y="50" key="CommitChangelistDialog2" timestamp="1582708680846">
<screen x="0" y="0" width="1440" height="900" />
</state>
<state x="303" y="50" key="CommitChangelistDialog2/0.0.1440.900@0.0.1440.900" timestamp="1582643176324" />
<state x="303" y="50" key="CommitChangelistDialog2/0.0.1440.900@0.0.1440.900" timestamp="1582708680846" />
<state x="144" y="78" width="1152" height="720" key="DiffContextDialog" timestamp="1582641811567">
<screen x="0" y="23" width="1440" height="793" />
</state>
@ -664,10 +671,10 @@
<screen x="0" y="0" width="1440" height="900" />
</state>
<state x="221" y="63" key="SettingsEditor/0.0.1440.900@0.0.1440.900" timestamp="1581061096545" />
<state x="320" y="190" key="Vcs.Push.Dialog.v2" timestamp="1582643177969">
<state x="320" y="190" key="Vcs.Push.Dialog.v2" timestamp="1582708682526">
<screen x="0" y="0" width="1440" height="900" />
</state>
<state x="320" y="190" key="Vcs.Push.Dialog.v2/0.0.1440.900@0.0.1440.900" timestamp="1582643177969" />
<state x="320" y="190" key="Vcs.Push.Dialog.v2/0.0.1440.900@0.0.1440.900" timestamp="1582708682526" />
<state x="100" y="100" width="1240" height="700" key="com.intellij.history.integration.ui.views.DirectoryHistoryDialog" timestamp="1581744794182">
<screen x="0" y="23" width="1440" height="797" />
</state>

@ -215,6 +215,16 @@ HotSpot JVM把年轻代分为了三部分1个Eden区和2个Survivor区
1. 引用计数法:引用计数法是一种简单但速度很慢的垃圾回收技术。每个对象都含有一个引用计数器,当有引用连接至对象时,引用计数加1。当引用离开作用域或被置为null时,引用计数减1。虽然管理引用计数的开销不大,但这项开销在整个程序生命周期中将持续发生。垃圾回收器会在含有全部对象的列表上遍历,当发现某个对象引用计数为0时,就释放其占用的空间。
2. 可达性分析算法这个算法的基本思路就是通过一系列的称为“GC Roots”的对象作为起始点从这些节点开始向下搜索搜索所走过的路径称为引用链当一个对象到GC Roots没有任何引用链相连用图论的话来说就是从GC Roots到这个对象不可达则证明此对象是不可用的。
### G1和CMS的比较
1. CMS收集器是获取最短回收停顿时间为目标的收集器因为CMS工作时GC工作线程与用户线程可以并发执行以此来达到降低手机停顿时间的目的只有初始标记和重新标记会STW。但是CMS收集器对CPU资源非常敏感。在并发阶段虽然不会导致用户线程停顿但是会占用CPU资源而导致引用程序变慢总吞吐量下降。
2. CMS仅作用于老年代是基于标记清除算法所以清理的过程中会有大量的空间碎片。
3. CMS收集器无法处理浮动垃圾由于CMS并发清理阶段用户线程还在运行伴随程序的运行自热会有新的垃圾不断产生这一部分垃圾出现在标记过程之后CMS无法在本次收集中处理它们只好留待下一次GC时将其清理掉。
4. G1是一款面向服务端应用的垃圾收集器适用于多核处理器、大内存容量的服务端系统。G1能充分利用CPU、多核环境下的硬件优势使用多个CPUCPU或者CPU核心来缩短STW的停顿时间它满足短时间停顿的同时达到一个高的吞吐量。
5. 从JDK 9开始G1成为默认的垃圾回收器。当应用有以下任何一种特性时非常适合用G1Full GC持续时间太长或者太频繁对象的创建速率和存活率变动很大应用不希望停顿时间长(长于0.5s甚至1s)。
6. G1将空间划分成很多块Region然后他们各自进行回收。堆比较大的时候可以采用采用复制算法碎片化问题不严重。整体上看属于标记整理算法,局部(region之间)属于复制算法。
7. G1 需要记忆集 (具体来说是卡表)来记录新生代和老年代之间的引用关系,这种数据结构在 G1 中需要占用大量的内存,可能达到整个堆内存容量的 20% 甚至更多。而且 G1 中维护记忆集的成本较高,带来了更高的执行负载,影响效率。所以 CMS 在小内存应用上的表现要优于 G1而大内存应用上 G1 更有优势大小内存的界限是6GB到8GB。
### 哪些对象可以作为GC Roots
1. 虚拟机栈(栈帧中的本地变量表)中引用的对象。
@ -327,7 +337,7 @@ AQS内部有3个对象一个是state用于计数器类似gc的回收计
### 如何指定多个线程的执行顺序
1. 设定一个 orderNum每个线程执行结束之后更新 orderNum指明下一个要执行的线程。并且唤醒所有的等待线程。
2. 在每一个线程的开始,要 while 判断 orderNum 是否等于自己的要求值不是,则 wait是则执行本线程。
2. 在每一个线程的开始,要 while 判断 orderNum 是否等于自己的要求值不是,则 wait是则执行本线程。
### 为什么要使用线程池

Loading…
Cancel
Save