线上定位GC内存泄露问题

原因:Java中存在内存泄露,就是因为对象无用却可达。

举个例子: 
在这个例子中,我们循环申请Object对象,并将所申请的对象放入一个Vector中,如果我们仅仅释放引用本身,那么Vector仍然引用该对象,所以这个对象对GC来说是不可回收的。因此,如果对象加入到Vector后,还必须从Vector中删除,最简单的方法就是将Vector对象设置为null。

Vector v=new Vector(10);
for (int i=1;i<100; i++)
{
    Object o=new Object();
    v.add(o);
    o=null; 
}

//此时,所有的Object对象都没有被释放,因为变量v引用这些对象。 这时候这些Object就是不可用可达的对象,GC不会帮我们清理的, 这就存在了内存泄露了。

//除非你把变量v的每个元素也置空:

Vector v=new Vector(10);
for (int i=1;i<100; i++)
{
    Object o=new Object();
    v.add(o);
    v.get(i) = null;
    o=null;
}

 

1.ps -ef | grep xxx | grep -v grep:查看进程是否存在。

2.假如1是true的话,则查看tomcat的catlalina.out日志和系统gc日志,是否有内存溢出。

3.假如2是true的话,则用命令:jmap -heap 1000看下java堆的情况。

4.假如2是true的话,则用命令:jstat -gcutil pid 1000和ps -mp 1000 -o THREAD,tid,time>a.log查看堆中各代的占用情况和GC情况。

5.假如3是true的话,则用命令:jstack pid > a.log获取线程Dump信息。

6.假如4是true的话,则用命令:jmap -histo:live和jstat -printcompiliation -h3 1000(注意jmap命令会触发Full GC,并发访问量较大的线上环境慎用)查看了下活对象。

7.假如5是true的话,则打印GC原因:/java/bin/jinfo -flag +PrintGCReason

8.jps -l -m找到处于死锁状态应用的进程id

 

posted @   ppjj  阅读(619)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示