获得徽章 0
#日新计划# #Java #技术分享 #避坑指南
分享一个极其隐蔽、杀伤力极强的网络 I/O 连环坑。
发现很多同学手写网络通信或者包装流的时候,非常容易产生两个幻觉:
以为用了 try-with-resources,JVM 就会帮你搞定所有的资源释放和刷新。
以为 close() 和 shutdownOutput() 是一回事。
结果一到生产环境,要么两端死等(TCP 互锁),要么抛出莫名其妙的 SocketException: Socket output is shutdown,甚至最可怕的——程序不报错,但数据静默丢失了一大半。
如果你对 TCP 的“半关闭(Half-Close)”机制和 JVM 内存缓冲池的边界还有点模糊,这篇复盘长文绝对能帮你打通任督二脉。
分享一个极其隐蔽、杀伤力极强的网络 I/O 连环坑。

发现很多同学手写网络通信或者包装流的时候,非常容易产生两个幻觉:
以为用了 try-with-resources,JVM 就会帮你搞定所有的资源释放和刷新。
以为 close() 和 shutdownOutput() 是一回事。
结果一到生产环境,要么两端死等(TCP 互锁),要么抛出莫名其妙的 SocketException: Socket output is shutdown,甚至最可怕的——程序不报错,但数据静默丢失了一大半。
如果你对 TCP 的“半关闭(Half-Close)”机制和 JVM 内存缓冲池的边界还有点模糊,这篇复盘长文绝对能帮你打通任督二脉。
展开
评论
2
#挑战每日一条沸点# 兄弟们,考个初级但极其容易翻车的 I/O 题:
如果我在 finally 块里连着写了两行代码:
fileWriter.close();
fileWriter.flush();
请问会发生什么?
A. 完美释放资源,数据绝对不丢
B. 抛出 java.io.IOException: Stream closed
C. 编译报错
很多写了几年 CRUD 的老哥可能都会答错。其实不仅是顺序问题,连着写这两个方法本身就是对底层 OS 资源分配的误解。
昨晚 Review 代码,抓到一个包含 3 个致命毒瘤的 I/O 读写现场。从 JVM 内存逃逸到 OS 内核态的 PageCache,我写了篇复盘,带大家一次性把 flush 和 close 的底层博弈扒干净。
避坑传送门:
如果我在 finally 块里连着写了两行代码:
fileWriter.close();
fileWriter.flush();
请问会发生什么?
A. 完美释放资源,数据绝对不丢
B. 抛出 java.io.IOException: Stream closed
C. 编译报错
很多写了几年 CRUD 的老哥可能都会答错。其实不仅是顺序问题,连着写这两个方法本身就是对底层 OS 资源分配的误解。
昨晚 Review 代码,抓到一个包含 3 个致命毒瘤的 I/O 读写现场。从 JVM 内存逃逸到 OS 内核态的 PageCache,我写了篇复盘,带大家一次性把 flush 和 close 的底层博弈扒干净。
展开
评论
2
#Java面试 #多线程 #避坑指南
兄弟们,出个多线程的题: main 线程打印完“End”退出了,子线程还在 while(true) 里死循环。 请问:JVM 进程会退出吗?
A. 会,主线程死了一切都得死。 B. 不会,JVM 还没下班。 C. 看子线程是不是“守护线程”。
刚写了一篇复盘,带你搞懂 用户线程 vs 守护线程 的生死契约,顺便教你一行代码解决这个“永生” Bug。
避坑传送门:
兄弟们,出个多线程的题: main 线程打印完“End”退出了,子线程还在 while(true) 里死循环。 请问:JVM 进程会退出吗?
A. 会,主线程死了一切都得死。 B. 不会,JVM 还没下班。 C. 看子线程是不是“守护线程”。
刚写了一篇复盘,带你搞懂 用户线程 vs 守护线程 的生死契约,顺便教你一行代码解决这个“永生” Bug。
展开
评论
点赞
#每天一个知识点# #Java #代码避坑 #面试题
兄弟们,考个冷门基础题: 往 Properties 对象里 put 一个整数 88,然后用 getProperty 取出来,结果会是多少?
A. "88" B. 88 C. null D. 抛异常
很多人第一反应是 A 或 B,实际运行结果却是 C (null)。 这不是 Bug,这是 Java 早期为了省事搞出来的“历史技术债”。
刚写了一篇复盘,带你看看 Properties 继承 Hashtable 到底有多坑。文末有个“书生与屠夫”的比喻,包你看懂。
避坑传送门:
兄弟们,考个冷门基础题: 往 Properties 对象里 put 一个整数 88,然后用 getProperty 取出来,结果会是多少?
A. "88" B. 88 C. null D. 抛异常
很多人第一反应是 A 或 B,实际运行结果却是 C (null)。 这不是 Bug,这是 Java 早期为了省事搞出来的“历史技术债”。
刚写了一篇复盘,带你看看 Properties 继承 Hashtable 到底有多坑。文末有个“书生与屠夫”的比喻,包你看懂。
展开
1
4
#日新计划# #Java面试 #HashMap #源码避坑
兄弟们,问个颠覆认知的问题:HashMap 一定要等到 0.75 负载因子满了才扩容吗?
昨天群里有个老哥,才存了 10 个数据,HashMap 容量竟然直接从 16 飙到了 64!而且链表还变红黑树了!
很多人以为是 Bug,其实这是 JDK 8 源码里藏着的一个**“不自信”机制**。
刚写了一篇复盘,带你扒一扒 treeifyBin 方法里的“甩锅”逻辑。面试官问扩容的时候,这一招绝对是加分项!
揭秘传送门:
兄弟们,问个颠覆认知的问题:HashMap 一定要等到 0.75 负载因子满了才扩容吗?
昨天群里有个老哥,才存了 10 个数据,HashMap 容量竟然直接从 16 飙到了 64!而且链表还变红黑树了!
很多人以为是 Bug,其实这是 JDK 8 源码里藏着的一个**“不自信”机制**。
刚写了一篇复盘,带你扒一扒 treeifyBin 方法里的“甩锅”逻辑。面试官问扩容的时候,这一招绝对是加分项!
展开
评论
3
#每天一个知识点# #Java基础 #底层原理 #冷知识
兄弟们,写代码时有没有被 ArrayIndexOutOfBoundsException 搞崩过心态?
为什么 Java(还有 C/C++/Python)非要规定数组下标从 0 开始? 既然是“第 1 个元素”,叫 arr[1] 难道不比 arr[0] 更符合直觉吗?
很多人以为这是规定,其实这背后全是算计! 刚写了一篇短文,带你穿越回 C 语言时代,从内存偏移量的角度扒一扒这个“反人类”设计的真相。
揭秘传送门:
兄弟们,写代码时有没有被 ArrayIndexOutOfBoundsException 搞崩过心态?
为什么 Java(还有 C/C++/Python)非要规定数组下标从 0 开始? 既然是“第 1 个元素”,叫 arr[1] 难道不比 arr[0] 更符合直觉吗?
很多人以为这是规定,其实这背后全是算计! 刚写了一篇短文,带你穿越回 C 语言时代,从内存偏移量的角度扒一扒这个“反人类”设计的真相。
展开
评论
1
#每天一个知识点# #JVM #Java面试 #拒绝八股文
还在死记硬背“堆是共享的,栈是私有的”吗?面试官一问“本地方法栈干嘛的”就卡壳?🤯
其实 JVM 根本就是一家火锅店!🍲
堆 = 大圆桌(放菜)
栈 = 服务员托盘(端菜)
方法区 = 墙上的菜单
刚写了一篇图解,带你进店吃顿火锅,顺便把 JVM 内存模型搞懂。文末附带一张“面试救命表”,建议收藏防身!
干货传送门:
还在死记硬背“堆是共享的,栈是私有的”吗?面试官一问“本地方法栈干嘛的”就卡壳?🤯
其实 JVM 根本就是一家火锅店!🍲
堆 = 大圆桌(放菜)
栈 = 服务员托盘(端菜)
方法区 = 墙上的菜单
刚写了一篇图解,带你进店吃顿火锅,顺便把 JVM 内存模型搞懂。文末附带一张“面试救命表”,建议收藏防身!
展开
评论
1
#每天一个知识点# #Java面试 #源码阅读 #冷知识
兄弟们,问个基础题:StringBuilder 默认容量 16,追加字符满了之后,它会自动扩容到多少?
A. 32 (翻倍) B. 17 (够用就行) C. 34
很多人第一反应是 32,其实 JDK 8 的源码里藏了一个 *2 + 2 的逻辑。 刚写了一篇短文,扒了一下 AbstractStringBuilder 的源码,顺便聊聊为什么要 +2。
避坑指南传送门:
兄弟们,问个基础题:StringBuilder 默认容量 16,追加字符满了之后,它会自动扩容到多少?
A. 32 (翻倍) B. 17 (够用就行) C. 34
很多人第一反应是 32,其实 JDK 8 的源码里藏了一个 *2 + 2 的逻辑。 刚写了一篇短文,扒了一下 AbstractStringBuilder 的源码,顺便聊聊为什么要 +2。
展开
评论
点赞
#每天一个知识点# 面试官:Integer a = 127; Integer b = 127; 它们相等吗?那 128 呢?
很多人以为自己懂 ==,结果在这道题上翻车了。
其实这背后藏着 Java 的“VIP 休息室”(缓存机制)。刚写了一篇复盘笔记,带你通过源码看懂为什么 127 是真爱,128 却是路人。
干货传送门:
很多人以为自己懂 ==,结果在这道题上翻车了。
其实这背后藏着 Java 的“VIP 休息室”(缓存机制)。刚写了一篇复盘笔记,带你通过源码看懂为什么 127 是真爱,128 却是路人。
展开
评论
点赞