虚拟机本地方法

  • 来源:
  • 更新日期:2018-05-18

摘要:本地方法栈与JVM Stack所发挥的作用是非常相似的,区别只是JVM Stack为虚拟机执行Java方法服务,而本地方法栈是为虚拟机使用到的Native方法服务。

 本地方法栈与JVM Stack所发挥的作用是非常相似的,区别只是JVM Stack为虚拟机执行Java方法服务,而本地方法栈是为虚拟机使用到的Native方法服务。

201607050428556980.jpg

在虚拟机规范中对本地方法栈中方法使用的语言、方式、数据结构没有强制规定要使用哪一种。甚至有的虚拟机(如HotSpot)直接将本地方法栈和JVM Stack合二为一。与JVM Stack一样,也会抛出StackOverflowError和OutOfMemoryError异常。
对大多数应用来说Java堆(Java Heap)是JVM所管理的内存中最大的一块。该区的唯一目的就是存放对象实例几乎所有的对象实例都在这里分配内存。
在实现时既可以是固定大小的也可以扩展,不过主流的虚拟机都是按照可扩展来实现的(-Xmx和-Xms)。如果堆中没有内存来完成实例分配,并且堆无法再扩展时就会抛出OutOfMemoryError。
与Java Heap一样方法区是各个线程共享的内存区域,它主要用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然JVM规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫Non-Heap(非堆)目的应该是与Java Heap分区来的。
Java虚拟机规范对方法区的限制非常宽松的也可以选择不实现垃圾收集。垃圾收集行为在本区是比较少出现的但非数据进入方法区就如永久代的名字一样“永久”存在了。这个区域的内存回收主要是针对常量池的回收和对类型的卸载这部分区域的回收确实是有必要的。