在Java編程中,內(nèi)存溢出(Out Of Memory,OOM)和內(nèi)存泄漏(Memory Leak)是兩個常見的問題。當(dāng)程序需要的內(nèi)存超過了JVM能夠提供的內(nèi)存資源時,便會發(fā)生內(nèi)存溢出。而內(nèi)存泄漏則是指程序在使用完一些內(nèi)存資源后,沒有及時釋放這些資源,導(dǎo)致內(nèi)存空間被持續(xù)占用,從而耗盡系統(tǒng)的內(nèi)存資源。
public class OutOfMemoryDemo { public static void main(String[] args) { int i = 0; try { Listlist = new ArrayList<>(); String str = "java"; while (true) { list.add(str + i); i++; } } catch (Throwable e) { System.out.println("i = " + i); e.printStackTrace(); } } }
上述代碼中,通過循環(huán)不斷向List中添加String類型的變量,導(dǎo)致程序的內(nèi)存資源無法滿足需求而發(fā)生內(nèi)存溢出。在處理此類問題時,可以增加JVM的內(nèi)存限制,或者優(yōu)化程序的內(nèi)存使用,如及時清空沒有使用的對象資源等。
public class MemoryLeakDemo { private Mapmap = new HashMap<>(); public void add(String key, Object value) { map.put(key, value); } public Object get(String key) { return map.get(key); } public static void main(String[] args) { MemoryLeakDemo demo = new MemoryLeakDemo(); for (int i = 0; i< Integer.MAX_VALUE; i++) { demo.add("key" + i, new Object()); demo.get("key" + i); } } }
上述代碼中,通過向Map中添加Object類型的變量,不斷使用get方法獲取變量值,但沒有清除無用的變量資源,最終導(dǎo)致內(nèi)存泄漏。在遇到此類問題時,可以使用WeakReference等弱引用類型,或者對無用對象進(jìn)行及時清理,防止出現(xiàn)內(nèi)存泄漏問題。