JVM常见问题!

问题排查工具

https://fastthread.io/

https://gceasy.io/

https://heaphero.io/

服务器上查看堆栈信息工具

登陆上具体机器,执行命令:

  • wget https://raw.github.com/oldratlee/useful-scripts/release-2.x/bin/show-busy-java-threads

下载脚本:

  • sh 脚本,即可得到最忙线程信息

内存泄漏

对象不会再被程序用到了,但是GC又不能回收他们的情况,叫内存泄漏。

内存泄漏举例:

单例模式:

  • 单例的生命周期和应用程序一样长,如果持有对外部对象的引用的话,那么这个外部对象是不能被回收的,则会导致内存泄漏。

资源未关闭 :

  • 如:数据库连接,网络连接和IO连接必须手动Close,否则是不能被回收的。

内存溢出

元空间溢出

如果元空间发生内存溢出,会造成操作系统的内存溢出。

元空间溢出主要是由于加载的类太多,或者动态生成的类太多。

堆外内存溢出

这里的堆外内存指的是 Java 应用程序通过直接方式从操作系统中申请的内存。

在 Java 中可以通过相应的 API 去申请直接内存,通过监控工具,能够看到内存占用的明显增长。

为了限制这些危险的内存申请,可以通过设置相应的参数进行调整。

栈溢出

线程请求的栈深度大于虚拟机允许的最大深度。

虚拟机在扩展栈深度时,无法申请到足够的内存空间:OutOfMemoryError