PageSourceSearch

http://ibeetl.com/assets/index.html-DyifYjUz.js

js ibeetl.com collected 2026-10-03 23:19:41 UTC 15,768 bytes, 14 lines download raw bytes

1import{_ as s,c as a,b as t,o as l}from"./app-CNefOTx1.js";const e={};function n(h,i){return l(),a("div",null,i[0]||(i[0]=[t(`<h2 id="_5-19-aot" tabindex="-1"><a class="header-anchor" href="#_5-19-aot"><span>5.19 AOT</span></a></h2><p>AOT 指的是提前编译(Ahead-of-Time Compilation),直接将Java工程编译成可执行的二进制文件。相对于JIT在运行过程中逐步把热代码编译成二进制,他能较为明显的提高系统的启动速度和初始化运行速度,但目前看来,未必能比JIT方式更能提高系统性能。</p><p>在传统使用JIT情况下,JAVA系统通常启动较慢,且启动过程中涉及到类加载以及JIT执行,导致主机CPU一段时间内持续走高,响应较慢</p><p>除了能提高启动速度和运行性能外,使用AOT也带来其他好处</p><ul><li>降低内存消耗</li><li>打包为较小的体积,适合资源收限制的环境,如移动应用</li><li>基于如上俩个优点,适合容器化,FAAS应用。</li><li>防止程序被破译修改。</li></ul><p>Java目前最成熟的AOT工具是Graalvm,Oracle公司提供。如下是一个使用Graalvm编译运行Helllo World的过程</p><div class="language-typescript line-numbers-mode" data-ext="typescript" data-title="typescript"><button class="copy" title="Copy code" data-copied="Copied"></button><pre class="shiki shiki-themes vitesse-light vitesse-dark vp-code"><code><span class="line"><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">public</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> static</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> void</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> main</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">String</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">[]</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> args</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">){</span></span>
2<span class="line"><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">    System</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">out</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">println</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">&quot;</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">hello word</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">&quot;</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">);</span></span>
3<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>使用native-image 编译,在我本机上运行约60秒,打包大小约8M</p><div class="language-java line-numbers-mode" data-ext="java" data-title="java"><button class="copy" title="Copy code" data-copied="Copied"></button><pre class="shiki shiki-themes vitesse-light vitesse-dark vp-code"><code><span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">lijiazhi</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">@</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">lijiazhis-</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">MacBook</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">-</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">Pro project </span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">%</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> ls </span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">-</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">l</span></span>
4<span class="line"><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">total </span><span style="--shiki-light:#2F798A;--shiki-dark:#4C9A91;">13168</span></span>
5<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">-</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">rwxr</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">-</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">xr</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">-</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">x  </span><span style="--shiki-light:#2F798A;--shiki-dark:#4C9A91;">1</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> lijiazhi  staff  </span><span style="--shiki-light:#2F798A;--shiki-dark:#4C9A91;">6732864</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">  8月 </span><span style="--shiki-light:#2F798A;--shiki-dark:#4C9A91;">20</span><span style="--shiki-light:#2F798A;--shiki-dark:#4C9A91;"> 12</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">:</span><span style="--shiki-light:#2F798A;--shiki-dark:#4C9A91;">44</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> helloworld</span></span>
6<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">-</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">rw</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">-</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">r</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">--</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">r</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">--</span><span style="--shiki-light:#2F798A;--shiki-dark:#4C9A91;">  1</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> lijiazhi  staff      </span><span style="--shiki-light:#2F798A;--shiki-dark:#4C9A91;">434</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">  8月 </span><span style="--shiki-light:#2F798A;--shiki-dark:#4C9A91;">20</span><span style="--shiki-light:#2F798A;--shiki-dark:#4C9A91;"> 12</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">:</span><span style="--shiki-light:#2F798A;--shiki-dark:#4C9A91;">43</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> HelloWorld</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">class</span></span>
7<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">-</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">rw</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">-</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">r</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">--</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">r</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">--</span><span style="--shiki-light:#2F798A;--shiki-dark:#4C9A91;">  1</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;"> lijiazhi  staff      </span><span style="--shiki-light:#2F798A;--shiki-dark:#4C9A91;">135</span><span style="--shiki-light:#393A34;--shiki-dark:#DBD7CAEE;">  8月 </span><span style="--shiki-light:#2F798A;--shiki-dark:#4C9A91;">20</span><span style="--shiki-light:#2F798A;--shiki-dark:#4C9A91;"> 12</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">:</span><span style="--shiki-light:#2F798A;--shiki-dark:#4C9A91;">43</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> HelloWorld</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">.</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">java</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>可以通过<a href="https://start.spring.io/" target="_blank" rel="noopener noreferrer">Spring官方网</a>站生成一个Graalvm+Spring Boot项目</p><div class="language-typescript line-numbers-mode" data-ext="typescript" data-title="typescript"><button class="copy" title="Copy code" data-copied="Copied"></button><pre class="shiki shiki-themes vitesse-light vitesse-dark vp-code"><code><span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">@</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">RestController</span></span>
8<span class="line"><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">public</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> class</span><span style="--shiki-light:#2E8F82;--shiki-dark:#5DA994;"> HelloWorld</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span></span>
9<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">    @</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">ResponseBody</span></span>
10<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">    @</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">RequestMapping</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">&quot;</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">/</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">&quot;</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">)</span></span>
11<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">    public</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> String</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> say</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(){</span></span>
12<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">        return</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;"> &quot;</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">hello,world</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">&quot;</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
13<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">    }</span></span>
14<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>比较实用AOT和JIT的性能,可以看到AOT的性能无论是启动时刻,还是运行时刻性能都比较稳定。JIT启动时刻性能较低,这是因为存在加载class以及JIT需要运行过程再优化。但JIT在优化后的性能较AOT方式更好</p><table><thead><tr><th style="text-align:left;">比较项目</th><th style="text-align:left;">Native</th><th style="text-align:left;">JIT</th></tr></thead><tbody><tr><td style="text-align:left;">启动速度</td><td style="text-align:left;">0.2</td><td style="text-align:left;">2.5</td></tr><tr><td style="text-align:left;">大小</td><td style="text-align:left;">80M</td><td style="text-align:left;">20M+JVM(200M)</td></tr><tr><td style="text-align:left;">打包耗时</td><td style="text-align:left;">300秒</td><td style="text-align:left;">8秒</td></tr><tr><td style="text-align:left;">启动时候性能</td><td style="text-align:left;">2400TPS</td><td style="text-align:left;">1200TPS</td></tr><tr><td style="text-align:left;">启动后性能</td><td style="text-align:left;">2400TPS</td><td style="text-align:left;">4000TPS</td></tr></tbody></table><blockquote><p>关于JIT,参考本书6.4 JIT</p></blockquote><p>需要注意的是,企业级应用通常有很多懒加载,比如数据库连接池,Redis连接池,Dubbo注册等等,实际启动速度可能并没有比JVM运行更有优势。</p><p>另外,不是任何Java应用都能不经过调整,被GraalVM编译成二进制。 相对于类和资源被JVM动态加载执行,使用Graalvm 必须静态链接代码和资源,有较多的局限需要注意。比如</p><ul><li>提供了编译参数,以指示动态资源,动态加载的类,以及需要的系统属性</li><li>反射和动态代理默认不支持,需要配置反射的类和方法。</li><li>不支持字节码生成技术,因此许多JVM高级特性无法使用。使用时候需要确认第三方包是否支持Native</li></ul><p>
14因为,在业务系统使用Graalvm,还需要谨慎,确认应用自身以及依赖的框架和第三方包支持Natvie</p><p>,避免系统运行过程因为没有告知Graalvm编译,导致运行中出错。</p>`,19)]))}const k=s(e,[["render",n],["__file","index.html.vue"]]),r=JSON.parse('{"path":"/article/performance/policy_aot/","title":"性能优化-AOT","lang":"en-US","frontmatter":{"title":"性能优化-AOT","tags":["性能","新书"],"createTime":"2026/08/21 14:06:15","permalink":"/article/performance/policy_aot/","description":"5.19 AOT AOT 指的是提前编译(Ahead-of-Time Compilation),直接将Java工程编译成可执行的二进制文件。相对于JIT在运行过程中逐步把热代码编译成二进制,他能较为明显的提高系统的启动速度和初始化运行速度,但目前看来,未必能比JIT方式更能提高系统性能。 在传统使用JIT情况下,JAVA系统通常启动较慢,且启动过程中涉...","head":[["meta",{"property":"og:url","content":"http://ibeetl.com/article/performance/policy_aot/"}],["meta",{"property":"og:site_name","content":"闲大赋"}],["meta",{"property":"og:title","content":"性能优化-AOT"}],["meta",{"property":"og:description","content":"5.19 AOT AOT 指的是提前编译(Ahead-of-Time Compilation),直接将Java工程编译成可执行的二进制文件。相对于JIT在运行过程中逐步把热代码编译成二进制,他能较为明显的提高系统的启动速度和初始化运行速度,但目前看来,未必能比JIT方式更能提高系统性能。 在传统使用JIT情况下,JAVA系统通常启动较慢,且启动过程中涉..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:updated_time","content":"2026-08-21T06:57:39.000Z"}],["meta",{"property":"article:tag","content":"性能"}],["meta",{"property":"article:tag","content":"新书"}],["meta",{"property":"article:modified_time","content":"2026-08-21T06:57:39.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"性能优化-AOT\\",\\"image\\":[\\"\\"],\\"dateModified\\":\\"2026-08-21T06:57:39.000Z\\",\\"author\\":[]}"]]},"headers":[],"readingTime":{"minutes":2.67,"words":801},"git":{"updatedTime":1787295459000,"contributors":[{"name":"lijiazhi","username":"lijiazhi","email":"[email protected]","commits":1,"avatar":"https://gravatar.com/avatar/1b5114831459724ad4acc394423b4b48ecfa4a7e0659fbe07a0ce5181a1050a7?d=retro"}]},"autoDesc":true,"filePathRelative":"article/性能/aot.md","categoryList":[{"id":"92a2b5","sort":10000,"name":"article"},{"id":"afdb50","sort":10004,"name":"性能"}]}');export{k as comp,r as data};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.