<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>JVM - tag - 沐木</title><link>https://oldletter.cn/tags/jvm/</link><description>JVM - tag - 沐木</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Wed, 10 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://oldletter.cn/tags/jvm/" rel="self" type="application/rss+xml"/><item><title>Java 为什么不能直接解析 Lambda？从一个 ORM 查询说起</title><link>https://oldletter.cn/posts/java-lambda-parse-01-why/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate><author>mumu</author><guid>https://oldletter.cn/posts/java-lambda-parse-01-why/</guid><description><![CDATA[<blockquote>
<p>📅 2026-06-10 | 🏷️ Java, Lambda, JVM | 📖 阅读约 15 分钟</p></blockquote>
<hr>
<h2 id="问题起源">问题起源</h2>
<p>做 Java ORM 的时候，更让人羡慕的就是 C# 的 LINQ：</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-csharp">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title=""><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-csharp" data-lang="csharp"><span class="line"><span class="cl"><span class="c1">// C# — 直接写 Lambda，框架自动转 SQL</span>
</span></span><span class="line"><span class="cl"><span class="kt">var</span> <span class="n">users</span> <span class="p">=</span> <span class="k">await</span> <span class="n">context</span><span class="p">.</span><span class="n">Users</span>
</span></span><span class="line"><span class="cl">    <span class="p">.</span><span class="n">Where</span><span class="p">(</span><span class="n">u</span> <span class="p">=&gt;</span> <span class="n">u</span><span class="p">.</span><span class="n">Age</span> <span class="p">&gt;</span> <span class="m">18</span> <span class="p">&amp;&amp;</span> <span class="n">u</span><span class="p">.</span><span class="n">Name</span> <span class="p">==</span> <span class="s">&#34;Tom&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">.</span><span class="n">OrderBy</span><span class="p">(</span><span class="n">u</span> <span class="p">=&gt;</span> <span class="n">u</span><span class="p">.</span><span class="n">Id</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">.</span><span class="n">ToListAsync</span><span class="p">();</span></span></span></code></pre></div></div>
<p>我们也想在 Java 里这么写：</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-java">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title=""><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="c1">// 理想中的 Java ORM 写法</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">query</span><span class="p">.</span><span class="na">where</span><span class="p">(</span><span class="n">u</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">u</span><span class="p">.</span><span class="na">getAge</span><span class="p">()</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">18</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">u</span><span class="p">.</span><span class="na">getName</span><span class="p">().</span><span class="na">equals</span><span class="p">(</span><span class="s">&#34;Tom&#34;</span><span class="p">));</span></span></span></code></pre></div></div>
<p>但试了一下就发现，<strong>Java 运行时核心拿不到 Lambda 里面的结构</strong>。<code>u -&gt; u.getAge() &gt; 18</code> 这个表达式，运行时只能执行它（传一个 User 进去，返回 true/false），但拿不到&quot;age &gt; 18&quot;这个结构信息。</p>]]></description></item><item><title>深入字节码：ASM 和 Javac Plugin 如何真正解析 Lambda</title><link>https://oldletter.cn/posts/java-lambda-parse-03-bytecode-and-ast/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate><author>mumu</author><guid>https://oldletter.cn/posts/java-lambda-parse-03-bytecode-and-ast/</guid><description><![CDATA[<blockquote>
<p>📅 2026-06-10 | 🏷️ ASM, 字节码, Javac Plugin, JVM | 📖 阅读约 30 分钟</p></blockquote>
<hr>
<h2 id="前言">前言</h2>
<p>上一篇的两种方案（SerializedLambda、APT）有一个共同的限制：<strong>不能解析 Lambda 表达式</strong>，只能解析方法引用。</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-java">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title=""><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="c1">// ✅ 能解析 — 方法引用，有明确的方法名</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">Getter</span><span class="o">&lt;</span><span class="n">User</span><span class="p">,</span><span class="w"> </span><span class="n">Integer</span><span class="o">&gt;</span><span class="w"> </span><span class="n">getter</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">User</span><span class="p">::</span><span class="n">getAge</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// ❌ 不能解析 — Lambda 表达式，方法名是 &#34;lambda$main$0&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">Predicate</span><span class="o">&lt;</span><span class="n">User</span><span class="o">&gt;</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">u</span><span class="p">.</span><span class="na">getAge</span><span class="p">()</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">18</span><span class="p">;</span></span></span></code></pre></div></div>
<p>这一篇的两种方案可以直接解析 <code>u -&gt; u.getAge() &gt; 18</code>，但代价是需要深入 JVM 底层。</p>
<hr>
<h2 id="方案-3-asm-字节码分析">方案 3: ASM 字节码分析</h2>
<h3 id="原理">原理</h3>
<p>Lambda 表达式编译后，编译器会生成一个<strong>私有静态方法</strong>，这个方法包含了 Lambda 的实际逻辑。比如：</p>]]></description></item><item><title>JDK 8 vs 17 vs 26：Lambda 解析性能实测</title><link>https://oldletter.cn/posts/java-lambda-parse-05-benchmark/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate><author>mumu</author><guid>https://oldletter.cn/posts/java-lambda-parse-05-benchmark/</guid><description><![CDATA[<blockquote>
<p>📅 2026-06-10 | 🏷️ JVM, 性能, JMH, JDK | 📖 阅读约 20 分钟</p></blockquote>
<hr>
<h2 id="前言">前言</h2>
<p>前四篇实现了五条 Lambda 解析路线。这一篇用 JMH 在三个 JDK 版本上跑基准测试，看看：</p>
<ol>
<li>五条路线的性能差距到底有多大？</li>
<li>JDK 升级对性能有多大影响？</li>
<li>实际使用中应该怎么选？</li>
</ol>
<hr>
<h2 id="测试环境">测试环境</h2>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title=""><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><pre tabindex="0"><code>硬件: macOS ARM64 (Apple Silicon)
JDK 8:  BellSoft Liberica JDK 8u422 (aarch64)
JDK 17: Homebrew OpenJDK 17.0.19
JDK 26: Homebrew OpenJDK 26.0.1
JMH:    1.37</code></pre></div>
<p>JMH 参数：</p>
<ul>
<li>Fork = 2（2 个 JVM 进程，避免 JVM 特异性）</li>
<li>Warmup = 5（5 轮预热）</li>
<li>Measurement = 8（8 轮测量）</li>
<li>Mode = AverageTime（平均耗时，越小越好）</li>
</ul>
<hr>
<h2 id="重要前提缓存">重要前提：缓存</h2>
<p><strong>实际使用中，所有框架都会缓存解析结果。</strong></p>]]></description></item></channel></rss>