所有栏目 | 云社区 美国云服务器[国内云主机商]
你的位置:首页 > 云社区 » 正文

JAVA中的内存溢出和内存泄露是什么?

发布时间:2020-04-15 16:48:43

资讯分类:内存  java  溢出  泄露  溢出  内存  对象
JAVA中的内存溢出和内存泄露是什么?

我们都知道,Java凭借JVM有一套自动回收对象的机制,能自动进行内存管理,但这不是一劳永逸的方法,内存泄露和内存溢出还是会时时侵扰java编程人员!先来看下内存相应的概念!

内存泄露:内存中的无用对象因为引用存在,对象迟迟不能回收,导致内存占用越来越高,最终导致内存溢出; 比较常见的场景是生命周期短的对象已经不再需要,但是生命周期比较长的对象有着短周期的对象引用,导致内存泄露;

内存溢出:程序想要获取内存的时候,已经没有新的内存可供使用,这时就爆出了out of memory ,内存溢出又分为堆溢出和栈溢出!

堆溢出常见关键字有java.lang.OutOfMemoryError: Java heap space

栈溢出常见关键字java.lang.StackOverflowError

内存泄露的本质就是无用对象的持续增长,比如说:

1,静态类对象中存储其他对象,因为static的声明周期长,放入这些对象的其他对象迟迟得不到释放;

2,诸如数据库连接等网络,io连接,必须要显式的close掉,否则也容易泄露;

3,单例模式初始化对象时,引用其他的对象引用,也将导致对象不能释放;

如何避免内存泄露呢?长周期的对象中尽量不要引用短周期的对象,或者及时释放;可以经常使用jstack等内存工具监控内存的增长情况,及时进行处理!

内存泄露如果不是很严重,一时半会儿也发现不了,发展下去通常会变成情节严重的内存溢出!

我们知道堆主要用来放对象,栈用来存放对象引用,堆栈溢出通常是不同的原因导致的!

堆溢出常见的情景如下:

1,堆内存分配过小:可通过-Xms2048m -Xmx2048m调整堆内存

2,线程数过大,超过了操作系统限制

3.java.lang.OutOfMemoryError:PermGenspace:老年代溢出,可通过-XX:MaxPermSize=128m -XXermSize=128m调整

栈溢出常见情景如下:

递归调用方法,会创建大量栈帧,直至溢出!

无论是堆栈溢出还是泄露,几乎都是代码编写不严谨引起,最主要的是注意不要大量创建对象或者线程,并注意及时释放!

最近会持续的的分享JAVA开发相关技术,敬请关注。。

JAVA中的内存溢出和内存泄露是什么?

JAVA中的内存溢出和内存泄露分别是什么,有什么联系和区别,我谈谈自己的理解。

  • 内存泄漏(memory leak ):申请了内存不释放,比如100m的内存,分配了10m的内存一直不回收,那么可以用的内存只有90m了,仿佛泄露掉了一部分;通俗一点讲的话就是【占着茅坑不拉shi】。

  • 内存溢出(out of memory):申请内存时,没有足够的内存可以使用;通俗一点儿讲,一个厕所就三个坑,有两个站着茅坑不走的,剩下最后一个表示压力很大,这时候一下子来了两个人,坑位(内存)就不够了。

  • 内存泄漏和内存溢出的关系:内存泄露的增多,最终会导致内存溢出。

  • 这是一个很有味道的例子......

如上图,对象X引用对象Y,X的生命周期为60,Y的生命周期为20,当Y生命周期结束的时候,X依然引用着B,这时候,垃圾回收期是不会回收对象Y的;如果对象X还引用着生命周期比较短的A、B、C...对象A又引用着对象a、b、c...

那么就可能造成大量无用的对象不能被回收,进而占据了内存资源,造成内存泄漏,直到内存溢出。

内存泄漏的分类

  • 经常(不断)发生:发生内存泄露的代码会被多次执行,每次执行,泄露一块内存;

  • 偶然发生:在某些特定情况下才会发生;

  • 一次性:发生内存泄露的方法只会执行一次;

  • 隐式泄露:一直占着内存不释放,直到执行结束;严格的说这个不算内存泄露,因为最终释放掉了,但是如果执行时间特别长,也可能会导致内存耗尽。

内存泄露产生的可能原因

  • 循环过多或死循环,产生大量对象;

  • 静态集合类引起内存泄漏,因为静态集合的生命周期和应用一致,所以静态集合引用的对象不能被释放;

  • 单例模式,和静态集合导致内存泄露的原因类似;

  • 事件监听(listeners)和回调(callbacks);

  • 各种连接,比如数据库连接、Socket连接、IO等,必须显式释放(close);

  • 内存中加载数据量过大;我之前项目有一次上线的时候,应用启动奇慢直到夯死,就是因为代码中会加载一个表中的数据到缓存(内存)中,测试环境只有几百条数据,但是生产环境有几百万的数据。

我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。

留言与评论(共有 0 条评论)
   
验证码:
Top