java 内存溢出 内存泄露_java 内存泄露、内存溢出、内存不足
內存泄露
什么是內存泄露?
在維基百科上的定義如圖:
中文意思就是一個對象在內存中,而程序無法獲取此對象,于是不能釋放該對象所占用的內存。
百度百科上的定義如圖:
OWASP上的定義:
開發者無法釋放某塊不會再使用的內存。
用C語言解釋一下,例如:
#include void function_which_allocates(void) {
/* allocate an array of 45 floats */
float * a = malloc(sizeof(float) * 45);
/* additional code making use of 'a' */
/* return to main, having forgotten to free the memory we malloc'd */
}
int main(void) {
function_which_allocates();
/* the pointer 'a' no longer exists, and therefore cannot be freed,
but the memory is still allocated. a leak has occurred. */
}
程序中的指針a所指向的那塊內存在函數退出后并沒有釋放。malloc申請的是堆內存,正常情況下,使用完后要調用free來釋放該內存。
但是在java里面,java有垃圾收集器(Garbage Collection,GC),會自動收集垃圾,也就是不用的內存。所以,C語言里的情況,在java里不會出現,但是會有另外一種內存泄露的情況出現,例如:
Listlist = new ArrayList();
for (int i = 0; i < 100; i++) {
Object o = new Object();
list.add(o);
o = null;
}
此時,所有的Object對象都沒有被釋放,因為變量list引用這些對象。如果要釋放這些對象,應該調用:‘
list.clear();
但是,如果程序一直沒調用clear,就有可能發生內存泄露。
所以,java和C里面的內存泄露是不一樣的,區別:
C:沒有指針指向不再使用的內存,故無法釋放那塊內存。
java:有引用指向不再使用的內存,但是并沒有去釋放那塊內存。
內存溢出
英文叫memory overflow。與緩沖區溢出類似。比如,char ch[10],卻輸入11個char進去。
但是很多人直接把內存溢出當成內存不足了。
內存不足
英文叫out of memory。申請內存時,沒有足夠的空間。
內存泄露最終會導致內存不足。
另外,可以參考IBM上的文章http://www.ibm.com/developerworks/cn/java/l-JavaMemoryLeak/
總結
以上是生活随笔為你收集整理的java 内存溢出 内存泄露_java 内存泄露、内存溢出、内存不足的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 白云机场t1军人值机柜台在哪?
- 下一篇: 新时代十年军队国防发展的军队组织形式