Java常见面试题-JVM

JVM内存管理

  • JVM内存划分

    • 1.方法区(Method Area)
    • 2.堆区(Heap)
    • 3.虚拟机栈(VM Stack)
    • 4.本地方法栈(Native Method Stack)
    • 5.程序计数器(Program Counter Register)
  • 1.方法区(Method Area)
    方法区存放了要加载的类的信息(如类名、修饰符等)、静态变量、构造函数、final定义的常量、类中的字段和方法等信息。方法区是全局共享的,在一定条件下也会被GC。当方法区超过它允许的大小时,就会抛出OutOfMemory:PermGen Space异常。
    在Hotspot虚拟机中,这块区域对应持久代(Permanent Generation)

  • 2.堆区(Heap)
    堆区由所有线程共享,在虚拟机启动时创建。堆区主要用于存放对象实例及数组,所有new出来的对象都存储在该区域。

    • 3.虚拟机栈(VM Stack)
      • 每个线程对应一个虚拟机栈,它是线程私有的,生命周期和线程一样,每个方法被执行时产生一个栈帧(Statck Frame),栈帧用于存储局部变量表、动态链接、操作数和方法出口等信息,当方法被调用时,栈帧入栈,当方法调用结束时,栈帧出栈。
      • 局部变量表中存储着方法相关的局部变量,包括各种基本数据类型及对象的引用地址等,因此他有个特点:内存空间可以在编译期间就确定,运行时不再改变。
      • 虚拟机栈定义了两种异常类型:StackOverFlowError(栈溢出)和OutOfMemoryError(内存溢出)。如果线程调用的栈深度大于虚拟机允许的最大深度,则抛出StackOverFlowError;不过大多数虚拟机都允许动态扩展虚拟机栈的大小,所以线程可以一直申请栈,直到内存不足时,抛出OutOfMemoryError。
  • 4.本地方法栈(Native Method Stack)

    • 本地方法栈用于支持native方法的执行,存储了每个native方法的执行状态。本地方法栈和虚拟机栈他们的运行机制一致,唯一的区别是,虚拟机栈执行Java方法,本地方法栈执行native方法。在很多虚拟机中(如Sun的JDK默认的HotSpot虚拟机),会将虚拟机栈和本地方法栈一起使用。
    • 一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。这个特征并非java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern “C”告知C++编译器去调用一个C的函数。
      “A native method is a Java method whose implementation is provided by non-java code.”
  • 5.程序计数器(Program Counter Register)

    • JVM在解释字节码(.class)文件时,存储当前线程执行的字节码行号
    • 每个程序计数器只能记录一个线程的行号,因此它是线程私有的。

GC机制

猜你喜欢

转载自blog.csdn.net/u012497072/article/details/82498161