jvm内存区域重点概要

前言

jvm不论对于进阶高级java工程师来说,还是对于面试而言都是至关重要的,那么我们就来看一下jvm内存区域划分。

1.jvm的内存区域分类

jvm内存区域分为:

私有区域:程序计数器,java虚拟机栈;

共享区域:堆,本地方法栈,方法区;

2.堆内存:

  • 存放实例变量,new出来的对象
  • 垃圾回收区回收的主要区域;
  • 位于线程共享区;
  • 可能会发生OutOfMemoryError;

  举例说明堆内存溢出的情况:(配置vm参数:-Xms1m -Xmx1m -XX:+HeapDumpOnOutOfMemoryError)

public class HeapOOM {
    public static void main(String[] args) {
        while (true) {
            new HeapOOM();
        }
    }
}

  

3.虚拟机

  • 存放基本类型变量;
  • 可能会发生StackOverflowError和OutOfMemoryError;

   异常StackOverFlowError举例:

public class Demo {

    int stack = 1;


    public static void main(String[] args) {
        new Demo().increase();
    }

    public void increase() {
        stack++;
        increase();
    }

}

结果:Exception in thread "main" java.lang.StackOverflowError

  

4.本地方法栈

  • 执行native方法;

5.方法区

  • 存放虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码;
  • 包含常量池;

6.程序计数器

  • 当前线程所执行的字节码的行号指示器(即记录当前线程执行到哪里,同时下一步应该执行哪一步操作);
  • 如果线程正在执行的是一个java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果执行的是native方法,这个计数器为空;
  • 唯一不会发生OutOfMemoryError的区域;

具体的可以参考《深入了解java虚拟机这本书》,内容过于枯燥,更多的是一些概念性的东西,需要多多实践才能记住。

Ride the wave as long as it will take you.
原文地址:https://www.cnblogs.com/jianpanaq/p/9085188.html