Java虚拟机

  • JVM

Java可以跨平台得益于 JVM(java虚拟机),一次编写、到处运行;真正意义上的实现了跨平台。
如何跨平台:我们编写的Java源代码在编译后会生成一个Class文件,称为字节码文件。Java虚拟机负责将字节码文件翻译成特定平台下的机器代码,然后运行。编译的结果不是生成机器代码,而是生成字节码。字节码不能直接运行,必须由JVM转换成机器码。编译生成的字节码在不同的平台上是相同的,但是JVM翻译的机器码是不同的

  • JVM内存结构

JAVA源代码文件通过编译后变成虚拟机可以识别的字节码,JAVA程序在执行时,会通过类加载器把字节码加载到虚拟机的内存中

image.png

Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分为若干个不同的数据区域
分析 JVM 内存结构,主要就是分析JVM 运行时数据存储区域。JVM 的运行时数据区主要包括:方法区、程序计数器等。而 JVM 的优化问题主要在线程共享的数据区中:堆、方法区
image.png

  • 方法区

又称非堆(non-heap),是各个线程共享的内存区域,方法区用于存储已被虚拟机加载的类信息常量静态变量即时编译后的代码等数据。方法区中最著名的就是CLASS对象,CLASS对象中存放了类的元数据信息,包括:类的名称、类的加载器、类的方法、类的注解等
当我们new一个新对象或者引用静态成员变量时,Java虚拟机(JVM)中的类加载器子系统会将对应Class对象加载到JVM中,然后JVM再根据这个类型信息相关的Class对象创建我们需要实例对象或者提供静态变量的引用值。注意,我们定义的一个类,无论创建多少个实例对象,在JVM中都只有一个Class对象与其对应,即:在内存中每个类有且只有一个相对应的Class对象

image.png

image.png

实际上所有的类都是在对其第一次使用时动态加载到JVM中的,当程序创建第一个对类的静态成员引用时,就会加载这个被使用的类(实际上加载的就是这个类的字节码文件)。注:使用new创建类的新实例对象也会被当作对类的静态成员的引用(构造函数也是类的静态方法)

Java堆是垃圾收集器管理的内存区域,所有创建出来的实例对象还有数组都是存放在堆内存中,堆是Java虚拟机所管理的内存中最大的一块存储区域,堆内存被所有线程共享
垃圾收集器就是根据GC算法,收集堆上对象所占用的内存空间,堆上又分为了新生代和老年代,针对不同的分代又会有对象的垃圾回收器和相应的回收算法

JVM 中的包括 Java 虚拟机栈本地方法栈,两者的区别就是,Java 虚拟机栈为 JVM 执行 Java 方法服务本地方法栈则为 JVM 使用到的 Native 方法服务。两者作用是极其相似的,本文主要介绍 Java 虚拟机栈,以下简称栈。
Java虚拟机栈生命周期与线程相同
属于线程私有的数据区域,与线程同时创建,总数与线程关联,代表Java方法执行的内存模型。每个方法执行时都会创建一个栈帧来存储方法的的局部变量表操作数栈动态链接方法方法返回值返回地址等信息。每个方法从调用值结束就对于一个栈桢在虚拟机栈中的入栈和出栈过程,栈帧中的局部变量表可以存放基本类型,也可以存放指向对象的引用,当在某个方法中new Object()时,会在当前方法栈帧中的局部变量表存放一个指向堆内存实例对象的引用,详见下图

image.png

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容