标签:方法区 私有 平台 虚拟 内存结构 jvm 利用 系统开发 inf
我们实际的开发中,先利用JDK(调用本地的API)开发属于自己的JAVA程序后,通过JDK中的编译程序(javac)将我们的文本java文件编译成JAVA字节码,在JRE上运行这些JAVA字节码,JVM解释这些字节码,映射到CPU指令集或OS的系统调用。所以在讲JVM之前,我们先来讲一下容易和JVM搞混的两个概念JDK和JRE。简单粗暴的理解就是:JDK包含JRE,JRE包含JVM
JVM:Java虚拟机,它只认识xxx.class这种类型的文件,它能够将class文件中的字节指令进行识别,并调用操作系统上API完成动作。所以说,jvm是Java能够跨平台的核心。
JRE:Java运行时环境,jre包括jvm和java核心类库与支持文件。
JDK:Java开发工具包,jdk是整个java开发的核心,包括了java运行环境(jre)、一堆java工具(javac、java、jdb等)和java基础类库(即Java API包括rt.jar)。
jvm中文名称叫做Java虚拟机,它是由软件技术模拟出来计算机运行的一个虚拟的计算机。
jvm也充当这个一个翻译官的角色,我们编写出java程序后,是不能直接被操作系统所识别的,这时候jvm的作用就体现出来了,它负责把我们的程序翻译给操作系统听,告诉它我们的系统需要做什么操作。
我们都知道Java的程序需要经过编译后,产生.Class文件,JVM才能识别并运行它,JVM针对每个操作系统开发其对应的解释器,所以只要其操作系统有对应版本的JVM,那么这份Java编译后的代码就能够运行起来,这就是Java能一次编译,到处运行的原因。
jvm体系总体分四大块:
运行的程序是内容是放在运行时数据区中的,如上图蓝色那块依次来说明一下:
保存所有引用类型的真是信息(线程共享),也是说那些new出来的对象都是放在这块区域的。
线程私有,生命周期和线程一致。描述的是 Java 方法执行的内存模型:每个方法在执行时都会床创建一个栈帧(Stack Frame)用于存储局部变量表
、操作数栈
、动态链接
、方法出口
等信息。每一个方法从调用直至执行结束,就对应着一个栈帧从虚拟机栈中入栈到出栈的过程。当一个方法运行到一半需要调用另一个方法时,就创建一个新的栈帧表示新调用的方法,将原来那个方法压入栈中。当方法运行完毕,栈帧出栈,原来方法处于栈顶接着运行。和栈这一数据结构一样,虚拟机栈里面的栈帧遵循后进先出的原则。
public class TestDemo{ public static void main(String args[]){ String str = null; str.length(); } }
上面程序会报空指针异常,如下图,在报的这个异常中,有一行日志 at TestDemo,main(TestDemo.java:4) 代表程序运行到TestDemo 中main()函数第四行的时候发生的错误,就是通过程序计数器来记录这个程序运行的位置的。
和虚拟机栈类似,不过本地方法栈里面运行的方法不是用java写的,一般是用c或c++写的为虚拟机使用到Native方法服务,也有类似栈帧的的概念。
标签:方法区 私有 平台 虚拟 内存结构 jvm 利用 系统开发 inf
原文地址:https://www.cnblogs.com/mengY/p/12202486.html