内存泄漏与内存溢出

2018-08-22  本文已影响0人  63号大街

最近在画像项目里需要将某个标签进行筛选,但是有个操作是直接把数据从库里面拿出千万级别的标签放进内存中进行遍历操作,然后程序直接挂了。于是很好奇研究了下平时代码中会不会出现内存溢出的问题。

内存泄漏与内存溢出的概念

在long long ago,相传编程语言存在鄙视链,C鄙视C++,C++鄙视Java,Java鄙视c#,结果最后PHP莫名其妙成了世界上最好的语言(真香警告)。在大学的时候,一开始学C++程序总是容易崩溃,因为在C++中,对象占用的内存空间都必须有我们自己来显式回收,如果处理完之后忘记了回收内存,那它们所占用的内存空间就会产生内存泄漏,很容易造成程序的崩溃。对于Java来说,JVM垃圾回收机制会自动回收无用对象所占用的内存空间而不需要我们手动去释放。理论上在Java中是不存在内存泄漏与内存溢出的场景,但实际上,如果使用不当,Java程序也会存在内存泄漏的问题。

程序在运行过程中会不断地分配内存,那些不再使用的内存空间应该及时回收,从而保证系统可以再次使用这些内存,如果存在无用的内存没有被回收,那么这内存空间就存在内存泄漏。一般来说不可达的对象都是由JVM垃圾回收机制去回收,但是有些对象处于可达状态,程序却无法再去访问,那么这些对象所占用的内存空间就无法进行回收,所在空间就存在内存泄漏。简而言之也就是被分配的对象可达却无用。

简单来说当我们服务器内存不足以给程序分配内存空间时,此时程序就会报内存溢出错误。也就是内存泄漏是诱因,在多次积累之后会导致内存溢出。

分析Java运行时内存情况

了解了内存泄漏的概念之后,为了更准确定位导致内存泄漏的地方,有必要先分析下Java在运行时内存的使用情况。


Java运行时数据区

内存泄漏与内存溢出场景

排查方式

上一篇 下一篇

猜你喜欢

热点阅读