内存泄漏示例
成都创新互联公司2013年开创至今,先为尼木等服务建站,尼木等地企业,进行企业商务咨询服务。为尼木企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
在这个例子中,循环申请Object 对象,并将所申请的对象放入一个Vector 中,如果仅仅释放引用本身,那么Vector 仍然引用该对象,所以这个对象对GC 来说是不可回收的。因此,如果对象加入到Vector 后,还必须从Vector 中删除,最简单的方法就是将Vector对象设置为null。
Vector v = new Vector(10);
for (int i = 1; i100; i++){
Object o = new Object();
v.add(o);
o = null;
}// 此时,所有的Object 对象都没有被释放,因为变量v 引用这些对象。实际上无用,而还被引用的对象,GC 就无能为力了(事实上GC 认为它还有用),这一点是导致内存泄漏最重要的原因。
Java内存泄露\x0d\x0a一般来说内存泄漏有两种情况。一种情况如在C/C++语言中的,在堆中的分配的内存,在没有将其释放掉的时候,就将所有能访问这块内存的方式都删掉(如指针重新赋值);另一种情况则是在内存对象明明已经不需要的时候,还仍然保留着这块内存和它的访问方式(引用)。第一种情况,在Java中已经由于垃圾回收机制的引入,得到了很好的解决。所以,Java中的内存泄漏,主要指的是第二种情况。\x0d\x0a可能光说概念太抽象了,大家可以看一下这样的例子:\x0d\x0a1Vectorv=newVector(10);\x0d\x0a2for(inti=1;i
回答于 2022-12-14
内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存。
所以我们应该明确:存在内存溢出的因不一定导致内存溢出的果
public class Know {
public static void main(String [] args)
{
int w = new Integer(args[0]).intValue();
int h = Integer.parseInt(args[1]);
for(int i=0;ih;i++)
{
StringBuffer sb=new StringBuffer();
for(int j=0;iw;j++)
{
sb.append('*');
}
System.out.println(sb.toString());
}
}
}
这是我在网上找的一个例子,试验了一下,是对的,造成内存溢出的原因是
for(int j=0;iw;j++)
{
sb.append('*');
}
是死循环,我原先是这么写的一个例子
public class Know {
public static void main(String[] args) {
while(true){
System.out.println("ok");
}
}
}
但并没有导致内存溢出,应该是它消耗的内存比较小或者运行时间短,正如这句话所说“存在内存溢出的因不一定导致内存溢出的果”
希望可以帮到你