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 栈
内存模型
可见性
有序性、指令重排
指令重排基本原则
解析和编译运行