<html>
<head>
  <title>Fixing Slow Spring Boot Startup</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" href="/static/app.css">
<link rel="alternate" type="application/atom+xml" href="/atom.xml">
</head>
<body>
<header class="site-header">
  <div class="wrapper">
    <a class="site-title" href="/">Adam Neumann's blog</a>
    <nav class="site-nav">
      <input type="checkbox" id="nav-trigger" class="nav-trigger" />
      <label for="nav-trigger">
          <span class="menu-icon">
            <svg viewBox="0 0 18 15" width="18px" height="15px">
              <path d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.032C17.335,0,18,0.665,18,1.484L18,1.484z M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.032C17.335,6.031,18,6.696,18,7.516L18,7.516z M18,13.516C18,14.335,17.335,15,16.516,15H1.484 C0.665,15,0,14.335,0,13.516l0,0c0-0.82,0.665-1.483,1.484-1.483h15.032C17.335,12.031,18,12.695,18,13.516L18,13.516z"/>
            </svg>
          </span>
      </label>
      <div class="trigger">
                <a class="page-link" href="/pages/about.html">About</a>
                <a class="page-link" href="/pages/resources.html">Resources</a>
              </div>
    </nav>
  </div>
</header>
<main class="page-content">
  <div class="wrapper">
    <article class="post">
      <header class="post-header">
        <h1 class="post-title">Fixing Slow Spring Boot Startup</h1>
        <p class="post-meta">
          <span>Sep 2, 2017</span>
        </p>
      </header>
      <div class="post-content">
        <h3>TL;DR</h3>
<p>If you are running MacOS, add hostname (output of <code>hostname</code>) to the IPv4 &amp; IPv6 loopback entries in <code>/etc/hosts</code> to cut 10 seconds from Spring Boot startup time.</p>
<h3>The Problem</h3>
<p>Spring Boot has ALWAYS started slow for me.
Almost embarrassingly slow.
How slow?
Start with an empty Spring Boot Web application with Spring Initializer.</p>
<p><img src="/assets/slow-spring-boot-startup/spring-initializer.png" alt="Spring Initializer" /></p>
<p>Now launch the server using <code>./gradlew bootRun</code> and take a look at that launch time.</p>
<p><img src="/assets/slow-spring-boot-startup/bootRun-slow.png" alt="Slow bootRun" /></p>
<p><strong>12.184 seconds!!</strong>
To load nothing but framework.
Yuk!</p>
<p>It turns out as part of Spring Boot startup it makes several calls to <code>InetAddress.getLocalHost().getHostName()</code>, and <a href="https://github.com/spring-projects/spring-boot/issues/7087">this is known to be slow</a>.</p>
<p><a href="https://thoeni.io">Antonio Troina</a> released an awesome <a href="https://thoeni.io/post/macos-sierra-java/">post</a> and <a href="https://github.com/thoeni/inetTester">code sample</a> that highlights the issue.
Running inetTester produced this output:</p>
<p><img src="/assets/slow-spring-boot-startup/inetTester-slow.png" alt="Slow inetTester" /></p>
<p>The <code>InetAddress.getLocalHost().getHostName()</code> call took over 5 seconds.</p>
<h3>The Solution</h3>
<p>A solution exists, and that is to explicitly add your hostname into the IPv4 and IPv6 loopback interface entries in the hosts file.</p>
<p>Before, My standard-ish <code>/etc/hosts</code> file used to look like this:</p>
<p><img src="/assets/slow-spring-boot-startup/etc-hosts-slow.png" alt="Slow etc hosts" /></p>
<p>Here is what my <code>/etc/hosts</code> looks like now:</p>
<p><img src="/assets/slow-spring-boot-startup/etc-hosts-fast.png" alt="Fast etc hosts" /></p>
<p>Now with this change (and no reboot or no terminal restarts), inetTester outputs this:</p>
<p><img src="/assets/slow-spring-boot-startup/inetTester-fast.png" alt="Fast inetTester" /></p>
<p><strong>9 ms!</strong>
Down from 5011 ms.</p>
<p>What effect does this have on Spring Boot's startup time?
Take a look for yourself.</p>
<p><img src="/assets/slow-spring-boot-startup/bootRun-fast.png" alt="Fast bootRun" /></p>
<p><strong>2.264 seconds.</strong>
Down from 12.184 seconds.</p>

      </div>
    </article>
  </div>
</main>
<footer class="site-footer">
  <div class="wrapper">
    <div class="footer-col-wrapper">
      <div class="footer-col one-half">
        <h2 class="footer-heading">Adam Neumann's blog</h2>
        <ul class="contact-list">
          <li class="p-name">Adam Neumann</li>
          <li><a class="u-email" href="mailto:blog@noizwaves.com">blog@noizwaves.com</a></li>
        </ul>
      </div>

      <div class="footer-col one-half">
        <p>Technical blog of Adam Neumann. Engineer at Gusto in Boulder, CO.
        </p>
      </div>
    </div>
    <div class="footer-col-wrapper">
      <div class="social-links">
        <ul class="social-media-list">
          <li>
            <a href="https://github.com/noizwaves">
              <span class="username">Github</span>
            </a>
          </li>
          <li>
            <a href="https://www.twitter.com/noizwaves">
              <span class="username">Twitter</span>
            </a>
          </li>
        </ul>
      </div>
    </div>
  </div>
</footer>
</body>
</html>