從一個技術問題到如何解決問題和學習

從一個技術問題到如何解決問題和學習

經驗之談

從本身工做中遇到的問題,到系統的學習一些列的知識。java

從簡單的解決問題到深入理解背後的原理。node

遇到的問題

在 Mac 上使用 IntelliJ IDEA 啓動 Spring Boot 項目很慢 一個項目啓動要300多秒,5分鐘以上,簡直沒法接受。spring

看電腦配置,應該也沒問題。 用 top 命令看系統資源消耗狀況,也都很正常。 TODO:ps top 等系統命令shell

第一步,問其餘小夥伴

獲得一個比較奇怪的答案,兩位小夥伴啓動飛快,20 秒左右,兩位小夥伴和我同樣,啓動須要耗費5分鐘左右。macos

更奇怪的是兩位啓動快的小夥伴還不知道爲何本身啓動快。服務器

第二步,嘗試設置內存

以前也遇到過,因爲內存設置小了。致使應用卡的狀況,甚至是出現OOM。那就給應用設置 -Xms2048m -Xmx2048m,沒有任何效果。甚至嘗試了設置 IDEA 的內存,均沒有任何改善。ide

期間還有小夥伴問我爲何要把 -Xms 和 -Xmx 設置爲同樣大。工具

第三步,找搜索引擎幫忙 「Spring Boot 啓動慢」

果真萬能啊,找到了答案: 將 127.0.0.1 localhost 修改成127.0.0.1 localhost xxxxxx.local xxxxx 就是你的電腦名post

嘗試一下,果真OK了,啓動時間從5分鐘降到了25秒左右。 注意: 127.0.0.1 localhost 127.0.0.1 xxxxxx.local 彷佛我第一次這麼嘗試還不行學習

TODO:主機名、hosts 文件、DNS 域名解析的知識點

若是僅僅是要解決這個問題,那麼到這裏應該就能夠結束了。

127.0.0.1   localhost Jeroens-MacBook-Pro.local
::1         localhost Jeroens-MacBook-Pro.local

也有要求要連 ::1 一塊兒改的,我沒有改,也能 work TODO ::1 知識點

我還想看看有你沒有其餘解決方案,繼續 Google 「spring boot slow startup mac」

發現你們對 xxxxxx.local 還有不一樣的理解。

獲取 hostname 方式一

我第一次是用的 terminal 的 shell 前綴

即:txpdeMacBook-Pro

獲取 hostname 方式二

系統偏好設置 -> 共享

獲取 hostname 方式三

txpdeMacBook-Pro:~ yule$ hostname
txpdeMacBook-Pro.local

或者

txpdeMacBook-Pro:~ yule$ echo $HOSTNAME
txpdeMacBook-Pro.local

注意這裏的問題,咱們後面講解。 我將 txpdeMacBook-Pro.local 替換爲 txpdeMacBook-Pro 同樣能 work

#127.0.0.1	localhost	txpdeMacBook-Pro.local
127.0.0.1	localhost txpdeMacBook-Pro

設置 hostname 方式一

三條命令搞定

sudo scutil --set ComputerName "newname"
sudo scutil --set LocalHostName "newname"
sudo scutil --set HostName "newname"

scutil 是個可動態訪問 macOS 系統信息的交互式工具。 $ hostname newname這種方式是重啓失效

TODO: hostname 和 echo $HOSTNAME 的區別,shell 前綴 scutil 命令知識點 https://shockerli.net/post/macos-hostname-scutil/

設置 hostname 方式二

騷操做

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

一個神奇的問題,怎麼發生的不清楚,統一修改以後OK

個人兩個 terminal 中 shell 的前綴盡然不同 我第一次執行hostname 獲得的是 txpdembp,以至於我後面新開的 terminal 都是以 txpdembp:~ yule$ 開頭的,後來執行了echo $HOSTNAME以後,hostname的值也變了 當我關掉全部的窗口,$HOSTNAME 也變了

txpdeMacBook-Pro:~ yule$ hostname
txpdeMacBook-Pro.local
txpdeMacBook-Pro:~ yule$ echo $HOSTNAME
txpdeMacBook-Pro.local
txpdeMacBook-Pro:~ yule$

徹底懵逼!

找了一篇官方的 BUG 說明

https://youtrack.jetbrains.com/issue/IDEA-161967

看來是 Java 和 操做系統的問題

InetAddress.getLocalHost().getCanonicalHostName();
說是這個方法會返回FQDN (Fully Qualified Domain Name),若是沒有配置主機名,那麼調用了這段代碼會拋出異常信息,而這個方法依賴於底層的操做系統

繼續 Google 「java.net.InetAddress.getLocalHost slow mac」

https://thoeni.io/post/macos-sierra-java/

解決方案就是設置 hosts 文件

以前在 CentOS 服務器上也遇到過 java.net.UnknownHostException

CentOS:須要修改或增長 /etc/sysconfig/network 中的 HOSTNAME 配置項 Ubuntu:須要修改或增長 /etc/hostname

https://crunchify.com/getting-java-net-unknownhostexception-nodename-nor-servname-provided-or-not-known-error-on-mac-os-x-update-your-privateetchosts-file/

https://bugs.openjdk.java.net/browse/JDK-8135259

https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-7180557

好像修復的問題不同 https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8066963

深刻學一下 Java DNS 相關知識

Java DNS查詢內部實現 http://ju.outofmemory.cn/entry/111943

TODO:Java DNS,Proxy代理相關知識點

附:如何修改 terminal 中 $ 符號以前的內容

You can define what you want to see before the $ in your terminal by modifying the file ~/.profile.

For example if you add to the file ~/.profile the following line:

# h is the host name, w the complete path 
export PS1="\h:\w$ "

you will see the host name and the complete path of the current directory: host_name:current_directory_path$ You can also modify my example by using the following options in the export command:

\d – Current date

\t – Current time

\h – Host name

# – Command number

\u – User name

\W – Current working directory (i.e: Desktop/)

\w – Current working directory, full path (i.e: /Users/Admin/Desktop)

相關文章
相關標籤/搜索