JVM调优--05---内存泄漏案例分析
Posted 高高for 循环
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM调优--05---内存泄漏案例分析相关的知识,希望对你有一定的参考价值。
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
内存泄漏 概念
何为内存泄漏 ?
只有对象不会再被程序用到了,但是GC又不能回收他们的情况,叫内存泄漏
内存泄漏与内存溢出的关系
内存泄漏的分类
java中----内存泄漏的8种情况
1. 静态集合类
2. 单例模式
3. 内部类持有外部类
4. 各种连接 ,如数据库连接,网络io连接等
5. 变量不合理的作用域
6. 改变的哈希值
7. 缓存泄漏
/**
* 演示内存泄漏
*
* @author shkstart
* @create 14:53
*/
public class MapTest
static Map wMap = new WeakHashMap();
static Map map = new HashMap();
public static void main(String[] args)
init();
testWeakHashMap();
testHashMap();
public static void init()
String ref1 = new String("obejct1");
String ref2 = new String("obejct2");
String ref3 = new String("obejct3");
String ref4 = new String("obejct4");
wMap.put(ref1, "cacheObject1");
wMap.put(ref2, "cacheObject2");
map.put(ref3, "cacheObject3");
map.put(ref4, "cacheObject4");
System.out.println("String引用ref1,ref2,ref3,ref4 消失");
public static void testWeakHashMap()
System.out.println("WeakHashMap GC之前");
for (Object o : wMap.entrySet())
System.out.println(o);
try
System.gc();
TimeUnit.SECONDS.sleep(5);
catch (InterruptedException e)
e.printStackTrace();
System.out.println("WeakHashMap GC之后");
for (Object o : wMap.entrySet())
System.out.println(o);
public static void testHashMap()
System.out.println("HashMap GC之前");
for (Object o : map.entrySet())
System.out.println(o);
try
System.gc();
TimeUnit.SECONDS.sleep(5);
catch (InterruptedException e)
e.printStackTrace();
System.out.println("HashMap GC之后");
for (Object o : map.entrySet())
System.out.println(o);
8. 监听器和回调
内存泄漏----案例分析
1. ThreadLocal
提升–10—ThreadLocal简介
2. 用数组实现栈
public class Stack
private Object[] elements;
private int size = 0;
private static final int DEFAULT_INITIAL_CAPACITY = 16;
public Stack()
elements = new Object[DEFAULT_INITIAL_CAPACITY];
public void push(Object e) //入栈
ensureCapacity();
elements[size++] = e;
public Object pop()
if (size == 0)
throw new EmptyStackException();
return elements[--size]
private void ensureCapacity()
if (elements.length == size)
elements = Arrays.copyOf(elements, 2 * size + 1);
分析问题 -----pop()
public Object pop()
if (size == 0)
throw new EmptyStackException();
return elements[--size]
修改
public Object pop()
if (size == 0)
throw new EmptyStackException();
Object result = elements[--size];
elements[size] = null;
return result;
3.
以上是关于JVM调优--05---内存泄漏案例分析的主要内容,如果未能解决你的问题,请参考以下文章
IOS性能调优系列:使用Instruments动态分析内存泄漏