java 应用程序卡死记录

情形一

写个 while 处理数据时,觉得 每个 while 处理结束了,对象就可被回收,此处是没问题的。

但是单个while直接造成内存不够的话,此时 GC 无法处理这些对象,就会导致程序卡死

情形二

k8s 部署的应用程序刷新缓存有时重启

经排查为容器内 tomcat 程序配置的内存超出容器剩余内存(容器除tomcat启动外剩余内存)。
例如:容器配置的内存大小为 4g 。不启动 tomcat ,单单启动容器就需要 1g ,此时如果给 tomcat 设置 -Xmx3500m 。应用跑的时候认为还有内存,不触发 GC 操作,然而实际没有了,分配内存就会造成内存溢出。如果我们不设置的话,默认堆大小为物理内存的[1/64, 1/4]。如果物理内存小于192M,则为物理内存的[1/64, 1/2]。

情形三

tomcat 程序卡死,进程没死,但是无响应

通过本地复现,visualVM 监听排查,确定为运行时必要内存不够,未剩余可用空间进行 GC 操作。需要确保分配内存至少支持一次并发动作(所有的场景都同时跑)并有一定的剩余空间,不然动作没执行完的话,占用内存空间是无法被 GC 回收的。

posted @ 2023-04-24 14:45  临渊不羡渔  阅读(157)  评论(0编辑  收藏  举报