如何用Java编写一段代码引发内存泄露,内存泄露
1个回答
展开全部
1、首先得搞清楚什么叫内存泄露,简单来说就是一个东西放在内存里的时间太长了,当你的程序都跑完了,它还存在那里。这时它是白白的占用了你的内存,累积起来占用的内存越来越多……最后就会导致JVM报错:out of memory。
2、一般情况下,别人如果能指出你的系统(程序)内存溢出,这个人应该还是挺厉害的。通常对于新人来说,喜欢把变量直接定义在class下(此时称之为实例变量,或者成员变量),那么在方法里调用后,这个实例变量是不会被释放的,大量的这样使用就可能会引发内存泄露。
3、把变量定义在方法里,当这个方法执行完毕后内存就得到释放了,这是个好习惯。
4、如果想要看到内存溢出,可以按这样的思路去尝试一下:定义一个静态的实例变量(list或其它集合),然后在一个方法里循环往这个静态变量塞东西,直到这个实例变量撑爆你的jvm内存。很快你就能看到out of memory……
123456789101112131415161718192021222324import java.util.ArrayList;import java.util.List; public class MemoryTest { private static List list = new ArrayList(); private static int count = 0; public static void main(String[] args) throws InterruptedException { System.out.println("申请前的可用内存 = "+getFreeMemory()); while(true){ list.add(new byte[1024*1024]);//用实例变量申请1M内存,当方法执行完毕时,这个static的变量是不会被释放 count++; if (count % 100 == 0) { System.out.println("当前list.size()="+list.size()+",可用内存 = "+getFreeMemory()); Thread.sleep(500); } } } public static long getFreeMemory() { return Runtime.getRuntime().freeMemory() / (1024 * 1024); } }
2、一般情况下,别人如果能指出你的系统(程序)内存溢出,这个人应该还是挺厉害的。通常对于新人来说,喜欢把变量直接定义在class下(此时称之为实例变量,或者成员变量),那么在方法里调用后,这个实例变量是不会被释放的,大量的这样使用就可能会引发内存泄露。
3、把变量定义在方法里,当这个方法执行完毕后内存就得到释放了,这是个好习惯。
4、如果想要看到内存溢出,可以按这样的思路去尝试一下:定义一个静态的实例变量(list或其它集合),然后在一个方法里循环往这个静态变量塞东西,直到这个实例变量撑爆你的jvm内存。很快你就能看到out of memory……
123456789101112131415161718192021222324import java.util.ArrayList;import java.util.List; public class MemoryTest { private static List list = new ArrayList(); private static int count = 0; public static void main(String[] args) throws InterruptedException { System.out.println("申请前的可用内存 = "+getFreeMemory()); while(true){ list.add(new byte[1024*1024]);//用实例变量申请1M内存,当方法执行完毕时,这个static的变量是不会被释放 count++; if (count % 100 == 0) { System.out.println("当前list.size()="+list.size()+",可用内存 = "+getFreeMemory()); Thread.sleep(500); } } } public static long getFreeMemory() { return Runtime.getRuntime().freeMemory() / (1024 * 1024); } }
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询