1、堆溢出,堆是存放實例物件的,但是這樣堆區遲早會滿。設定了堆區內存,創建就會拋出異常。
public class HeapOOM { static class User {} public static void main(String[] args) { List<User> list = new ArrayList<User>(); while (true) { list.add(new User()); } } } /*Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded at com.fdd.test.HeapOOM.main(HeapOOM.java:11)*/
2、虛擬機器堆疊和本機方法堆疊溢位
如果執行緒要求的堆疊深度大於虛擬機器鎖定允許的深度,則拋出StackOverflowEror例外。
如果虛擬機器在擴展堆疊時無法申請足夠的儲存空間,則會出現異常。
public class StackOutOfMemoryError { public static void main(String[] args) { test(); } private static void go() { System.out.println("StackOverflowError异常"); test(); } } /*Exception in thread "main" java.lang.StackOverflowError at sun.nio.cs.ext.DoubleByte$Encoder.encodeLoop(DoubleByte.java:617) at java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:579) at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:271) at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:125) at java.io.OutputStreamWriter.write(OutputStreamWriter.java:207) at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:129) at java.io.PrintStream.write(PrintStream.java:526) at java.io.PrintStream.print(PrintStream.java:597) at java.io.PrintStream.println(PrintStream.java:736) at com.fdd.test.StackOutOfMemoryError.go(StackOutOfMemoryError.java:11) at com.fdd.test.StackOutOfMemoryError.go(StackOutOfMemoryError.java:13)*/
3、方法區與執行時間常數池溢位
#4、本機直接記憶體溢位
DirectMemory容量可透過-XX:MaxDirectMemorySize指定,如不指定,預設與Java堆的值(-Xmx指定)相同。
以上是java記憶體溢出的四種情況是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!