1、jvm運行機制java
寫一個程序,讓程序在運行以後,最終拋出因爲Perm區溢出引發的OOM,給出運行的jdk版本,程序源碼,運行參數,以及系統溢出後的截圖、程序所依賴的jar包說明,並說明你的基本思路dom
``` package com.tencent.tubemq.example; import java.util.ArrayList; import java.util.List; import java.util.UUID; /** * description: 在jdk1.8中,其實已經沒有永久代這一說了,取而代之的是一個叫元空間(Meta space)。而常量池放到了堆中,因此也就不會出現PermGen space了 那麼若是想看到metaspace的異常怎麼作呢? 一個是能夠把這兩個值設置的足夠小,那麼啓動就會報錯了。 -XX:MetaspaceSize=3M -XX:MaxMetaspaceSize=3M 一個是可使用jdk動態加載技術,例如cglib動態的生成大量的數據來達到 * * @author: dawn.he QQ: 905845006 * @email: dawn.he@cloudwise.com * @email: 905845006@qq.com * @date: 2019/9/22 8:44 AM */ public class PermOOM { public static void main(String[] args) { List<String> list = new ArrayList<String>(); while (true) { list.add(UUID.randomUUID().toString().intern()); System.out.println(UUID.randomUUID().toString().intern()); } } } ```
系統溢出後打印的異常棧: Error occurred during initialization of VM MaxMetaspaceSize is too small.jvm
你能想到有什麼辦法,可讓一個程序的函數調用層次變的更深。好比,你在一個遞歸調用中,發生了stack的溢出,你能夠作哪些方面的嘗試,使系統儘可能不溢出?闡述你的觀點和緣由。函數
答:首先了解到線程在調用每一個方法的時候,都會建立相應的棧,在退出方法的時候移出棧楨,而且棧是私用的,也須要佔用空間,因此讓一個程序的函數調用層次變的更深 減小棧貞的空間很必要。或者增大線程的線的大小。 ``` package com.tencent.tubemq.example; /** * jdk8 啓動參數是默認參數 * * @author dawn.he */ public class OverflowTest { private volatile int i = 0; public static void main(String[] args) { OverflowTest o = new OverflowTest(); try { // 沒增長方法棧佔用空間前 over flow deep:19590 // 增長方法棧佔用空間後 over flow deep:5547 String s = "1"; o.deepTest(s); } catch (Throwable e) { System.out.println("over flow deep:" + o.i); e.printStackTrace(); } } private void deepTest(String s) { //這裏註釋掉s 的賦值操做能夠減小方法棧的佔用空間 s = "一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字"; s += "一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字"; s += "一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字一段長長的漢字"; ++i; deepTest(s); } } ```
因此我想到的方法是:減小方法棧佔用空間,或者增長線程棧的空間。spa
jvm啓動流程線程
jvm基本結構3d
pc寄存器code
方法區blog
java 堆遞歸
java 棧
內存模型
可見性
有序性、指令重排
指令重排基本原則
解析和編譯運行