JVMがlocalhostのIPアドレスを解決するのに時間がかかる


112

macOS Sierraにアップグレードした後、「sbt test」(localhost名/ IPアドレスの検索を含む)のパフォーマンスに問題があるようです。以前のバージョンのOS Xでは、完了するまでに約40〜50秒かかりました。macOS Sierraの時間はそれよりはるかに長いです。私が行った最後の実行は約15分でした。コンパイル時間は、「El Capitan」とほぼ同じです。

私のチームからこの新しいmacOSを試すのは私だけなので、自分のMacでのみ発生しているのか、それとも一般的な問題なのかはわかりません。

私の同僚にもUbuntuで同様の問題があり、乱数生成がテストの速度低下に関連していた- サービスの応答時間が遅い:Java SecureRandom&/ dev / random

残念ながら、それは私にはうまくいきませんでした。もともと私はJDK 8u54でそれを試し、次にJDK 8u102にアップデートしようとしましたが、それも助けにはなりませんでした。

PS Macbook Pro Mid-2015 2.8GHz i7、16GB RAM、1TB SSDを実行しています。


私は使用gradle clean testしており、同じ問題が発生しています。
Max Peng

これはOpenJDKに報告されたバグです:bugs.openjdk.java.net/browse/JDK-8143378これは、修正されない別のバグの複製として解決されました。おそらく再開する必要があります。
Lórántピンター

回答:


326

私も同じ問題を抱えていました。Tomcatは15秒から6分でアップグレード後のスプリングコンテキストを初期化しました... csrutilsを無効にしても問題は解決しませんでした。

私は、次のように、アドレスにマップされたファイルにMacホスト名(Macbook.local、またはMacが呼び出されるもの)を追加することで問題を解決しました。/etc/hosts127.0.0.1::1

127.0.0.1   localhost mbpro.local
::1         localhost mbpro.local

興味がある場合は、https//thoeni.io/post/macos-sierra-java/で問題と解決策の詳細を確認できます

この投稿では、問題のトラブルシューティングとソリューションの検証に役立つgithubプロジェクトにもリンクしています。

問題は、localhostの名前解決がどのように機能するか、java.net.InetAddrクラスがアドレスを取得する方法に関連している(私は信じています)。私は数人の同僚と確認しましたが、どうやらシエラにアップグレードしたすべての人に起こるわけではありませんが、私はまだこの変更のルーツを調査しています。

とにかく、ソリューションはantid0teが実装してすぐに機能したのと同じでした。


同じ問題...また、SIPを無効にしても機能しないことを確認できます。
2016

すばらしいです。github
christmo

21
それを見つけた!Mac名ではありません。そのホスト名です。ターミナルに「ホスト名」と入力すると、正しいホスト名を与えることができます。
VK321 2016年

1
OSX 10.14.2では、これが数年後も見られます。修正してくれてありがとう。
Malcolm Crum、

1
macOS Mojave 10.14.4、まだ問題。localhostIPv4およびIPv6ループバック行(127.0.0.1::1)の後にホスト名を追加することで、まだ検証済みの修正です!

43

正解:JVMでlocalhostのIPアドレスを解決するのに時間がかかる

怠惰な人々のために:

sudo sed -i bak "s^127\.0\.0\.1.*^127.0.0.1 localhost $(hostname)^g" /etc/hosts
sudo sed -i bak "s^::1.*^::1 localhost $(hostname)^g" /etc/hosts
sudo ifconfig en0 down
sudo ifconfig en0 up

4
驚くばかり!これにより、Minecraftの起動時間が12秒から0.5秒に短縮されました。
ボブ

@camikillerホスト名と共有>コンピュータ名の2つの異なる値が表示されます。どちらを使用するかを明確にしてください。
vikramvi 2017

より良い解決策は、MacOS @vikramviをアップグレードすることです
camikiller 2017

@camikiller後、私は、あたりにやったapple.stackexchange.com/questions/66611/...同じ名前を持っているが、それでもそれは働いていません。共有で他の設定を行う必要がありますか?
vikramvi 2017

@vikramvi /etc/hostsファイルを手動で編集して2つのホストを追加してみてください
camikiller

6

私は同じ問題を抱えています。私のスプリングブートアプリケーションは、ヨセミテでの25秒に対して、シエラでの起動に60秒かかります。

デバッグ中に、問題がInetAddress.getLocalHost()に起因することがわかりました。127.0.0.1と:: 1のホスト名を追加するようにホストファイルを変更しました。これで、アプリケーションは以前と同じくらい速く起動します。


2
こんにちは、私はこの高レベルの説明が役立つ場合に見つけました(ただし、MacOS Sierraリリースで何が変更されたのかは明確ではありません):「ホスト名を要求すると、JDKはそれをIPアドレスに解決します。結果の少なくとも1つが入力ホスト名にマップされることを確認します。遅いのはこの逆引きです。遅いことはJVMに限定されません。そのような逆引きを実行しようとするOS上のものはすべて、 / etc / hostsの適切な構成。」(github.com/spring-projects/spring-boot/issues/7087から)
thoeni

3

たとえば、システム環境設定>共有>リモートログインを有効にすると、ホスト名に自動的にIPアドレスが割り当てられます。

アップグレード後に問題が発生するため、ホスト名の解決方法が10.12で変更されたと想定することは理にかなっています。つまり、少なくとも10.11ではホスト名は常に解決されますが、10.12ではシステム設定でサービスが有効になっている場合にのみ解決されます>共有(10.11の誰かがこれを確認できた)。


10.12.5を使用しましたが、ソリューションが機能しませんでした。どのバージョンがありますか?
vikramvi 2017

@vikramvi 10.12.6を使用していますが、私のインストールでは、説明どおりに動作します。標準の/ etc / hostsファイルと共有を無効にすると、ping $(hostname)は不明なホストエラーで失敗します。共有を有効にすると、ホスト名がVLANのIPに解決されます。Java(8u141)の場合、共有が無効になっている場合、InetAddress.getLocalHost()を呼び出すと5秒かかります。共有を有効にすると、実行時間が13msに下がります。
jurajw 2017

これは機能します(実際には奇妙ですが)、「リモートログイン」がすでにチェックされている場合でも、チェックを外してからもう一度チェックします。物事は再び機能し始めます。あなたはそれを1回/ブートLOLする必要があります。また、「mDNS」プロセスを(以前に)強制終了したことがある場合は、このトリックを実行して.localアドレスを戻す必要があることにも注意してください。または、/ etc / hostsの方法を使用して、より永続的な修正を行います
rogerdpack

1

新しいOSの一般的な問題だと思います。同様の問題があります。tomcatにデプロイされるWebアプリケーションがあります。El Capitanでは10秒で起動しましたが、今では95秒かかり、クライアント(Swingベースのデスクトップアプリ)はそれに接続できません(少なくとも時間がかかりました)。シンプルなテストコンソールアプリが適切に実行されるため、これはネットワーク通信に関するものだと思います。


1
SIPをオフにすると問題が解決します。macossierra-slow.com/...
アンドラーシュGyetvan

1

へのアップデートをインストールした後、それは奇妙な問題でしたMac Sierra 10.12 (16A323)。以下のホストファイルで、問題をソートしました。

::1         localhost <myhostname>.local   <--- Was already present
127.0.0.1   localhost <myhostname>.local   <--- Solved the tomcat loading issue

myhostname$hostnameは、ターミナルのどこからでもコマンドで取得できます。


0

受け入れられた答えは私を助けました!これをここに追加するだけで、私にとっての問題は何だったと思いますか:

私のホスト名は「私のMac」のようなもので、解決できませんでした。設定では、コンピューターがmymac.localでアドレス指定できることが示されました

私はそれがスペースだと思って、私のMacの名前を「my.mac」に変更しましたが、自動的に追加されたDNSがまだmymac.localだったので、これも役に立ちませんでした

my.macを/ etc / hostsに追加すると、そのときに役立ちました。

したがって、実際の問題は何だと思います。これは、コンピュータ名に文字以外のものが含まれている場合にのみ発生します。これはosによって自動的に削除され、ホスト名とdnsエントリが一致しなくなります。(手動で追加して修正できます)


1
問題はそれよりも深いと思います...ホスト名はすべて通常の英字でしたが、それを/ etc / hostsに追加すると、私にとって奇妙な問題の範囲が解決しました
Magnus

0

Macでも同じ問題が発生しました。

プライマリとBonjourのホスト名を英数字のみを含むように変更すると、問題が解決しました。彼が同様の問題に直面しているときにどこかでアドバイスを読んだ同僚からアイデアが生まれました(彼はどこにいたのか思い出せませんでした)。

このガイドからインスピレーションを得て、これらは私が従ったステップでした:

まず、プライマリホスト名を変更します

sudo scutil --set HostName <new host name>

例えば:

sudo scutil --set HostName eggsandwich

次に、Bonjourのホスト名を変更します(完全を期すために、この手順なしでは試したことがないので、必要ない場合もあります)。

sudo scutil --set LocalHostName <new host name>

例えば:

sudo scutil --set LocalHostName eggsandwich

ここで、問題が発生していたJavaプロセスを再起動します。うまくいけば、プロセスがハングしないはずです。

余談ですが、これにより、ターミナルの新しいタブが私の設定にかかわらず同じディレクトリでbashを開始しないという別の問題も解決しました。それがなぜ起こったのか私には説明がありませんが、私はとても嬉しく思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.