wuqiu-ai / daily-interviews

java面试之每日一练
0 stars 0 forks source link

[JVM] 第8天 你了解java内存模型嘛 2020-09-04 #51

Open wuqiu-ai opened 4 years ago

wuqiu-ai commented 4 years ago

你了解java内存模型嘛?

wuqiu-ai commented 4 years ago

JVM架构

  1. classloader:加载class文件到内存;
  2. execution engine:对命令进行解析;
  3. native interface:本地接口
  4. runtime data area:jvm内存空间结构
  5. natice libraies:本地方法库

JVM内存模型-jdb8

线程私有:

  1. 程序计数器

    当前线程所执行的字节码行号指示器; 改变计数器的值来选取下一条需要执行的字节码指令; 和线程是一一对应关系的; 对java方法计数,如果是native方法则计数器值为undefined; 不会发生内存泄漏;

  2. 虚拟机栈

    java方法执行的内存模型 包含多个栈帧,局部变量表+操作栈+动态链接+返回地址

  3. 本地方法栈

    与虚拟机栈类似,主要作用标注了native方法

    线程共享

  4. metaspace(类加载信息 oom)

    元空间使用本地内存,而永久代使用jvm内存;

  5. 常量池(字面量和符号引用 oom)+ 堆(数组和类对象 OOM)
    1. 对象实例分配实例;

      递归为什么会引起栈溢出(java.lang.stackoverflowerror)

      每次调用一次方法就会压栈; 递归过深,栈帧超过虚拟机栈深度;

解决办法:限制递归次数

虚拟机栈过多会引发oom异常?

会发生java.lang.OutOfMemoryError unable to create new native thread