java堆內存:是存放對象本身,不存放對象的引用也不存放基本數據類型,jvm中只有一個堆(heap)所有線程共享。
java棧內存:用來存放局部變量(方法中定義的基本數據類型和對象的引用),線程私有,超過變量的作用域,java會自動釋放掉爲該變量分配你的內存空間替工給其他變量使用。
Java自動管理棧和堆,程序員不能直接地設置棧或堆。
堆棧溢出
堆溢出,不斷的創建新的 對象,沒有及時回收導致堆溢出,還有一個創建很大的對象導致堆溢出
public class Heap{
public static void main(String[] args) {
ArrayList list=new ArrayList();
while(true) {
list.add(new Heap());
}
}
}
或者
public class Heap{
public static void main(String[] args) {
byte[][] array=new byte[1024*1024][1024*1024];
}
}
會報錯:java.lang.OutOfMemoryError: Java heap space
棧溢出:一般是遞歸不斷的創建變量造成棧內存不足。
public class Stack{
public static void main(String[] args) {
new Stack().test();
}
public void test() {
test();
}
}
報錯:
java.lang.StackOverflowError
避免內存泄露:
是在聲明對象引用之前,明確內存對象的有效作用域。在一個函數內有效的內存對象,應該聲明爲 local 變量,與類實例生命週期相同的要聲明爲實例變量……以此類推。第二,在內存對象不再需要時,記得手動將其引用置空。
堆棧溢出解決:
此時可以通過增大jvm的堆內存來解決這個問題,當然了這個是最直接的方式,如果可以優化代碼也是可以的,比如使用單例模式去優化代碼。
在運行Java程序時,有兩個參數可以用於對jvm堆內存的調整:
-Xms(用於設置jvm堆內存的初始大小)
-Xmx(用於設置jvm堆內存的最大可用內存)