栈溢出、內存溢出、Java內存泄露

栈溢出、內存溢出、Java內存泄露

栈溢出:
在调用函数时,程序执行会创建函数栈帧。栈溢出出现在递归调用栈帧超出一定层数。

內存溢出:
申请巨大内存时出现内存溢出。

Java內存泄露:
内存泄露一般在c和c++中多见,因为c和c++中的内存创建和释放都是由程序员主动调用,如果创建了而没有释放,则产生内存泄露。
Java有垃圾回收器,程序员无法主动释放内存,内存释放由垃圾回收器自己完成。是不是java就没有内存泄露呢?
内存泄露的定义是程序运行时间越长,占用存储空间越来越多,最终用尽全部存储空间,整个系统崩溃
创建而不释放会使内存占用随时间增长,还有就是持有无用内存使得垃圾回收器无法释放也会造成内存占用随时间增长。
Java内存泄露体现在文件打开而不主动关闭,数据库创建连接而不主动关闭,网络连接创建而不主动关闭,其产生原因涉及到系统对资源的管理。


示例源码:
/*
 * shsheng
 */
package Programing;

import java.util.Stack;

public class MemoryException {

    public static void main(String[] args) {
//        stackOverflow();
//        outOfMemory();
//        memoryLeak();
    }

//     栈溢出
    public static void stackOverflow() {
        stackOverflow();
    }

//    內存溢出
    public static void outOfMemory() {
        Object[] array;
        while (true) {
            array = new Object[1000000000];
            array = (Object[]) array[1];
        }
    }

//    內存泄露
    public static void memoryLeak() {
        Stack stack=new Stack();
//        向stack里面push 10个字符串
        for(int i=0;i<10;i++)
            stack.push(new String("hello"+i));
//        将10个字符串全部出栈
        for(int i=0;i<10;i++)
            stack.pop();
//        此时stack里面依然保存了push进去的10个字符串,因为出栈只是简单的将数组坐标下移,并没有将栈中对象赋值为null,
//        尽管当前栈为空,但是内存堆中保留的10个字符串对象,因为stack对其持有引用,所以无法释放,产生内存泄露。
//        理论上的内存泄露是随着程序的运行时间,内存消耗逐渐变大。
//        栈因为采用的是覆盖技术,所以不会产生真正的内存泄露,只是能够揭露内存泄露原理,即持有了无用的对象引用。
//        真正的java内存泄露体现在文件打开而不主动关闭,数据库创建连接而不主动关闭,网络连接创建而不主动关闭,
//        其产生原因涉及到系统对资源的管理。
//        在我们自己设计的程序中,也可能会造成内存泄露,例如设置一个缓存,但是不对其大小限制,
//        一味向缓存里面添加新数据而不是替换掉老的数据,因为持有了很多使用很少或者不会使用的无用数据,造成内存泄露。
    }

}


      
      

参考链接:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值