JVM

Java 发表评论

一、java程序运行过程


    (1)开发人员编写.java文件

    (2).java文件经过java编译器生成.class字节码文件

    (3)类加载器加载.class文件,加载完成之后交由JVM执行引擎执行

    (4)在加载和执行的过程中,JVM会用一段空间(运行时数据区即JVM内存)来保存程序执行需要的数据和相关信息,因此常说的内存管理,就是对这一段空间的管理

二、Runtime Data Area(运行时数据区)

  包含以下几个部分:

A、java栈

 java栈存放的是是一个个的栈,一个栈对应一个被调用的方法,栈包含图中的5个部分,当线程执行一个方法时,会建立一个栈,并往下压,当方法执行完毕之后就会出栈,所以线程当前执行的方法一定是在java栈的顶部的栈,并且不需要程序员去释放空间,栈内部会有自己的清理机制,当一个方法运行时,这个方法所需要的局部变量空间是可以确定的。

异常状况:

       (1)如果线程运行时的栈总的大小超过虚拟机限制的大小,会抛出StackOverFlow异常,通常发生在递归运行时。

       (2)如果虚拟机栈设置为动态扩展,在扩展时无法申请到足够的内存,会抛出OutOfMemory异常

B、本地方法栈

本地方法栈的原理与JAVA栈相似,区别是JAVA栈为执行java方法服务,本地方法栈是为执行本地方法(native 关键字修饰的方法)服务的。异常状况同JAVA栈。

C、程序计算器

程序计算器是为了保证多线程在CPU切换之后可以恢复到原来的地方。是JVM中唯一一块没有规定outOfMemory的区域。

D、堆

JVM中内存最大的一块,负责存放对象实例,被所有线程共享,是GC主要的处理区域。Java中的堆是用来存储对象本身的以及数组,在Java中,程序员基本不用去关心空间释放的问题,Java的垃圾回收机制会自动进行处理。因此这部分空间也是Java垃圾收集器管理的主要区域。

异常状况:

(1)当堆没有足够的内存来放置对象实例,且无法继续扩展时,会抛出outOfMemory异常。可以通过-Xmx和-Xms参数来控制堆的大小。

E、方法区

用于存储已被JVM加载的类信息、变量、静态变量、编译后的代码等数据,这一块也是被所有线程共享的。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

昵称 *