周报-8|内存泄漏、公司裁员、练车
前言
本篇是对 2023-02-20
到 2023-02-26
这周生活的记录与思考。首发在我的个人 博客,你可以移步了解更多或者给我留言。
这篇周报又是在地铁上完成编写的。回顾这一周的工作,还是项目测试、修复 bug 和准备上线发布。平静的工作节奏因为突如其来的裁员消息而变得内卷起来,大家下班的时间都纷纷往后移到了 20 点左右。周末的时候,还是练车,从汉口开车到新洲。刚开始有点不敢,后来还是鼓起勇气,平安的到达。
工作
内存泄漏
这周线上环境,出现了告警,提示 jvm 出现了 full gc。于是赶紧 dump 内存进行分析查找原因。顺便整理了内存相关的知识。
什么是内存泄漏?
这个问题直接问 chatgpt:
内存泄漏(Memory Leak)是指在程序中动态分配的内存由于某些原因程序未能释放或无法释放,导致系统内存的实际可用空间不断减少的现象。内存泄漏的发生会导致程序占用的内存越来越多,最终导致程序崩溃或系统变慢。
在 Java 中,程序员通常使用 new 运算符在堆上分配内存,这些内存不再使用时必须释放,否则就会出现内存泄漏。下面是一些常见的 Java 内存泄漏的情况:
- 对象持有过多的引用
当一个对象持有其他对象的引用时,这些对象就不能被垃圾收集器回收,导致内存泄漏。比如,一个静态集合(如 Map、List)持有了大量对象的引用,但是这些对象已经不再需要了,却因为集合中仍然持有这些对象的引用,导致这些对象无法被回收,造成内存泄漏。
- 长时间持有对象锁
在 Java 中,如果一个线程获取了一个对象的锁,但是在释放锁之前发生了异常,那么这个锁就不会被释放,从而导致内存泄漏。这种情况特别容易发生在 synchronized 块中。
- 不正确的缓存使用
如果程序员不正确地使用缓存,就会导致内存泄漏。比如,如果使用一个静态 Map 来缓存对象,但是不从 Map 中删除对象,那么这些对象就会一直存在于内存中,造成内存泄漏。
- 大量创建临时对象
如果程序频繁地创建临时对象,而这些对象又没有被及时清除,就会导致内存泄漏。比如,在循环中创建大量的字符串对象,但是没有及时清除,就会导致内存泄漏。
为了避免内存泄漏,Java 程序员可以使用一些技术来优化程序,比如使用缓存池、避免使用不必要的静态变量、使用 finalize()方法释放资源等等。
如何排查内存泄漏?
内存分析工具:内存分析工具可以帮助您找到哪些对象占用了大量的内存。一些常用的内存分析工具包括:Eclipse MAT、VisualVM 和 YourKit。这些工具可以帮助您分析内存快照、查找内存泄漏并确定导致内存泄漏的代码位置。
堆转储文件:堆转储文件是一个包含了 JVM 堆中所有对象的快照。您可以使用以下命令生成一个堆转储文件:jmap -dump:format=b,file=heap.bin ,其中是您的 Java 应用程序的进程 ID。然后,您可以使用内存分析工具来分析该文件。
代码审查:在编写代码时,您可以使用一些技巧来避免内存泄漏。例如,您应该确保正确地关闭流和数据库连接,避免在循环中创建对象,以及使用软引用或弱引用来存储缓存数据等。通过仔细审查代码并识别可能导致内存泄漏的部分,可以避免这些问题在运行时发生。
监视工具:JVM 提供了一些监视工具,例如 jstat 和 jconsole,可以用于监视 JVM 的内存使用情况。通过监视这些指标,您可以识别是否存在内存泄漏的迹象。
代码注入:在您的应用程序中,您可以注入一些代码,例如使用 JMX、AOP 等,以便您可以实时监视内存使用情况,并记录任何内存泄漏迹象。
参考文章
裁员
去年公司就在裁员,陆陆续续裁了几次,每次都是裁两三个,动作都不大,但是很高效。因为部门人数就在五十左右,所以谁没来上班,都能很快察觉。
公司要在六月份上市,上市之前要使财报好看,就要开源节流、降本增效。节约成本的一个方式就是裁员,据说这次裁员动作比以前都大都迅速,今天提出裁员人数,明天就要给出名单,月底就要走人。
现在还只是二月份,离六月还有三个月。谁也不知道,后面还会有什么更大的裁员动作。说不定哪天就空出一个工位,说不定哪天领导就换了人,说不定哪天部门就被拆散了。
互联网公司最大的变化就是变化。之前在阿里工作,公司的价值观里有一条就是拥抱变化。
拥抱变化的最好方式就是积极面对,主动加班,提高工作效率,增加工作产出。
生活
练车
这是买车之后的第二周,还是没有开车去上班。一是因为开车不过熟练,胆子小,不敢开得太快;二是公司楼下的停车位还没有办好。
周六本想叫朋友过来给我当陪练,后来因为要回新洲,就算了,还是自己开车,带着老婆回新洲。
老婆科目一考过了,后面因为工作原因就没去练车和考试。她坐副驾驶,一边剥豆子一边提醒我注意交通规则。
在老婆的坐镇之下,顺利的从汉口开车六十公里到达新洲,路上没有违反交通规则。
周六下午去看了一下潘塘花朝节,有点失望,没有想象中的热闹。可能因为这不是正宗的花朝节,正宗的应该是在旧街。
逛了一圈,买了两百菜刀、一个砧板、两颗果树、一盆墨兰花。
周六从新洲开回阳逻,周日又从阳逻开回老家去看父亲。买车后第一次回家,放了鞭炮 🧨。
中午包饺子,吃完饭就去菜园收割青菜。农村对于城市里上班族来说,一大好处是,每次回家,都可以装满青菜带回城市。
下午,从老家驱车回阳逻再到汉口。在开车的过程中,发现和总结了一些问题。
之前开车,总是盯着仪表盘,看车速达到了多少。车速一到 70 多就下意识地松油门和踩刹车。现在开始把眼睛注意力放到前方,不去可以在意车速,只是当导航提示我超速的时候,我白降低一点速度。
在红绿灯之前,如果不转弯,不要提前换道或者超车,保持中间道路行驶即可。
好物分享
虽然大部分有意思的内容会分享在 『ChenSoul Share』Telegram 频道,不过还是挑选一部分在这里列举一下,感觉更像一个 newsletter 了。
一些文章
一些工具
1、Raycast
Raycast 是一款想要取代 Spotlight 的快捷启动器,通过 Mac 上面的一些组合键来为让你完成在 Mac 上面的快捷启动,提高你日常当中在 Mac 上面的操作效率,如果以 macOS 系统版本风格来比喻的话,Alfred 的 UI 风格应该能匹配几年前的 macOS 吧,而 Raycast 却是能够驾驭 macOS Big Sur 全新的视觉风格。
以上。
Related content
- 2023-12-28|今天做了什么
- 2023-12-27|今天做了什么
- 2023-12-22|今天做了什么
- 2023-12-21|Spring Security对OAuth2的支持及实现方式
- 2023-12-20|Maven配置继承和生命周期、源码运行Nacos 2.3.0控制台
- 2023-12-19|Spring Security OAuth2配置JWT、Github Actions配置代码扫描
- 2023-12-18|使用Spring Security实现OAuth2授权和认证
- 2023-12-15|JNDI InitialContext源码分析、ClassLoader加载机制
- 2023-12-14|购买新的VPS服务器、最近在做什么
- 2023-12-13|发布到Maven中央仓库的第一个项目