组件说明:
类装载子系统
负责把编译好的class文件加载到内存,即是运行时数据区
运行时数据区
堆内存:
所有线程共享,虚拟机启动时创建,用于存放对象实例,几乎所有的对象(包含常量池)都在堆上分配内存,当对象无法再该空间申请到内存时将抛出OutOfMemoryError异常。同时也是垃圾收集器管理的主要区域。可通过 -Xmx –Xms 参数来分别指定最大堆和最小堆
方法区:
所有线程共享,类的所有字段和方法字节码,以及一些特殊方法如构造函数,接口代码也在此定义。简单说,所有定义的方法的信息都保存在该区域,静态变量+常量+类信息(构造方法/接口定义)+运行时常量池都存在方法区中,虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做 Non-Heap(非堆),目的应该是与 Java 堆区分开来。
java栈:
线程私有,即是每个线程都有自己的方法栈,java包含若干栈帧,一个栈帧对应线程调用的一个方法,根据调用顺序先后入栈。栈帧包含局部变量表,操作数栈,动态链接,方法出口等信息。当一个被调用方法执行完后,通过方法出口返回给调用方,然后该栈帧弹出Java栈,并销毁局部变量表等内容,释放空间。
程序计数器:
线程私有,就是一个指针,指向方法区中的方法字节码(用来存储指向下一条指令的地址,也即将要执行的指令代码),由执行引擎读取下一条指令,是一个非常小的内存空间,几乎可以忽略不记。
本地方法栈:
线程私有,登记native方法,在Execution Engine执行时加载本地方法库
执行引擎
负责执行Java指令
垃圾收集器:
负责监控运行数据区,收集无用对象,主要收集堆内存和方法区无用对象。
示例程序执行流程
1.main方法栈帧入栈,调用math方法,math方法栈帧入栈
2.执行math方法指令
3.执行结果返回给main方法
4.继续执行main方法指令
最后,欢迎指正交流
网友评论