从一个技术问题到如何解决问题和学习

从一个技术问题到如何解决问题和学习

经验之谈

从自己工作中遇到的问题,到系统的学习一些列的知识。

从简单的解决问题到深刻理解背后的原理。

遇到的问题

在 Mac 上使用 IntelliJ IDEA 启动 Spring Boot 项目很慢 一个项目启动要300多秒,5分钟以上,简直无法接受。

看电脑配置,应该也没问题。 用 top 命令看系统资源消耗情况,也都很正常。 TODO:ps top 等系统命令

第一步,问其他小伙伴

得到一个比较奇怪的答案,两位小伙伴启动飞快,20 秒左右,两位小伙伴和我一样,启动需要耗费5分钟左右。

更奇怪的是两位启动快的小伙伴还不知道为什么自己启动快。

第二步,尝试设置内存

之前也遇到过,由于内存设置小了。导致应用卡的情况,甚至是出现OOM。那就给应用设置 -Xms2048m -Xmx2048m,没有任何效果。甚至尝试了设置 IDEA 的内存,均没有任何改善。

期间还有小伙伴问我为什么要把 -Xms 和 -Xmx 设置为一样大。

第三步,找搜索引擎帮忙 “Spring Boot 启动慢”

果然万能啊,找到了答案: 将 127.0.0.1 localhost 修改为127.0.0.1 localhost xxxxxx.local xxxxx 就是你的电脑名

尝试一下,果然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)

转载于:https://my.oschina.net/u/920698/blog/3037869

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值