<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
    <title>bigfish的网络博客 - JVM</title>
    <subtitle>记录技术和生活</subtitle>
    <link rel="self" type="application/atom+xml" href="https://blog.laofu.online/tags/jvm/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://blog.laofu.online"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2021-06-27T10:00:00+08:00</updated>
    <id>https://blog.laofu.online/tags/jvm/atom.xml</id>
    <entry xml:lang="zh">
        <title>CMS 三色标记法</title>
        <published>2021-06-27T10:00:00+08:00</published>
        <updated>2021-06-27T10:00:00+08:00</updated>
        
        <author>
          <name>bigfish</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.laofu.online/blog/cms-three-color-mark/"/>
        <id>https://blog.laofu.online/blog/cms-three-color-mark/</id>
        
        <summary type="html">&lt;h3 id=&quot;wei-shen-me-yin-ru-san-se-biao-ji-fa&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#wei-shen-me-yin-ru-san-se-biao-ji-fa&quot; aria-label=&quot;Anchor link for: wei-shen-me-yin-ru-san-se-biao-ji-fa&quot;&gt;为什么引入三色标记法&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;为了提供 JVM 垃圾回收的性能，从 CMS 垃圾收集器开始，引入了并发标记的概念（此处的并发标记是指与用户线程一起工作）。引入并发标记的过程就会带来一个问题，在业务执行的过程中，会对现有的引用关系链出现改变。具体如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/three-color-mark/20210626215542908.png&quot; alt=&quot;image-20210626215542908&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/p&gt;</summary>
        
    </entry>
    <entry xml:lang="zh">
        <title>简述 G1 垃圾回收器和 OOM 问题的排查</title>
        <published>2020-09-12T10:00:00+08:00</published>
        <updated>2020-09-12T10:00:00+08:00</updated>
        
        <author>
          <name>bigfish</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.laofu.online/blog/g1-oom/"/>
        <id>https://blog.laofu.online/blog/g1-oom/</id>
        
        <summary type="html">&lt;p&gt;最近又碰到的 oom 的问题，一直在尝试定位中，由于现实使用的 G1 的垃圾回收器。所以今天打算线上的排查历程和方案查询出来。&lt;/p&gt;
&lt;h4 id=&quot;jvm-chang-yong-can-shu&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#jvm-chang-yong-can-shu&quot; aria-label=&quot;Anchor link for: jvm-chang-yong-can-shu&quot;&gt;jvm 常用参数&lt;/a&gt;&lt;/h4&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;-Xmx1024m 最大堆内存&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;-Xms1024m 最小堆内存&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;-Xss256k  设置栈的大小。栈都是每个线程独有一个，所有一般都是几百k的大小。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;-XX:MetaspaceSize=128m  元空间的大小&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;-XX:MaxMetaspaceSize=256m  最大元空间大小&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;-XX:MaxGCPauseMillis=200 设置每次年轻代垃圾回收的最长时间，如果无法满足此时间，JVM会自动调整年轻代大小，以满足此值&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;-XX:+UseG1GC 使用 G1 垃圾回收器&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;-XX:-OmitStackTraceInFastThrow 当一些异常在代码里某个特定位置被抛出很多次的话，HotSpot Server Compiler（C2）会用fast throw来优化这个抛出异常的地方。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;-XX:MinHeapFreeRatio=30&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;-XX:MaxHeapFreeRatio=50&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;-XX:MaxDirectMemorySize=100M 直接内存大小&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;-XX:+PrintGCDetails 打印 GC 详细信息&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;-XX:+DisableExplicitGC 禁止显示GC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</summary>
        
    </entry>
    <entry xml:lang="zh">
        <title>手写一个简单的 JVM（二）：模拟运行 JVM</title>
        <published>2020-06-10T10:00:00+08:00</published>
        <updated>2020-06-10T10:00:00+08:00</updated>
        
        <author>
          <name>bigfish</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.laofu.online/blog/jvm-run/"/>
        <id>https://blog.laofu.online/blog/jvm-run/</id>
        
        <summary type="html">&lt;h4 id=&quot;mo-ni-jvmzhi-ling-de-yun-xing&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#mo-ni-jvmzhi-ling-de-yun-xing&quot; aria-label=&quot;Anchor link for: mo-ni-jvmzhi-ling-de-yun-xing&quot;&gt;模拟JVM指令的运行&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;模拟JVM的运行，需要有两个个方面的知识准备&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;JVM的结构&lt;/li&gt;
&lt;li&gt;字节码的含义&lt;/li&gt;
&lt;/ol&gt;</summary>
        
    </entry>
    <entry xml:lang="zh">
        <title>手写一个简单的 JVM（一）：解析 Class 文件</title>
        <published>2020-06-05T10:00:00+08:00</published>
        <updated>2020-06-05T10:00:00+08:00</updated>
        
        <author>
          <name>bigfish</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.laofu.online/blog/jvm-class-file/"/>
        <id>https://blog.laofu.online/blog/jvm-class-file/</id>
        
        <summary type="html">&lt;h2 id=&quot;javade-yun-xing-guo-cheng&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#javade-yun-xing-guo-cheng&quot; aria-label=&quot;Anchor link for: javade-yun-xing-guo-cheng&quot;&gt;java的运行过程&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在运行一段  java  代码的时候需要经过&lt;code&gt;编译&lt;/code&gt;,&lt;code&gt;验证&lt;/code&gt;,&lt;code&gt;加载&lt;/code&gt;和&lt;code&gt;运行&lt;/code&gt;,具体如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/jvm/01.png&quot; alt=&quot;运行过程&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/p&gt;
&lt;p&gt;对于 Java 源码变成字节码的编译过程，我们暂且跳过不讨论。&lt;/p&gt;
&lt;p&gt;想弄清楚  java 代码的运行原理，其实本质就是 java 字节码如何被 jvm 执行。&lt;/p&gt;</summary>
        
    </entry>
</feed>
