从本身工做中遇到的问题,到系统的学习一些列的知识。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 设置为同样大。工具
果真万能啊,找到了答案: 将 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 知识点
发现你们对 xxxxxx.local 还有不一样的理解。
我第一次是用的 terminal 的 shell 前缀
即:txpdeMacBook-Pro
系统偏好设置 -> 共享
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
三条命令搞定
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/
骚操做
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
个人两个 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$
彻底懵逼!
https://youtrack.jetbrains.com/issue/IDEA-161967
看来是 Java 和 操做系统的问题
InetAddress.getLocalHost().getCanonicalHostName();
说是这个方法会返回FQDN (Fully Qualified Domain Name),若是没有配置主机名,那么调用了这段代码会抛出异常信息,而这个方法依赖于底层的操做系统
https://thoeni.io/post/macos-sierra-java/
解决方案就是设置 hosts 文件
CentOS:须要修改或增长 /etc/sysconfig/network 中的 HOSTNAME 配置项 Ubuntu:须要修改或增长 /etc/hostname
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查询内部实现 http://ju.outofmemory.cn/entry/111943
TODO:Java DNS,Proxy代理相关知识点
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)