JVM运行机制及其原理

JVM运行机制及其原理

JVM:JVM是Java Virtual Machine(Java虚拟机)的缩写.Java虚拟机主要由字节码指令集、寄存器、栈、垃圾回收堆和存储方法域等构成。

JVM生命周期JVM伴随着Java程序的开始而开始,程序的结束而结束,一个Java程序会开启一个JVM进程,一台计算器上可以运行多个JVM进程。

JVM将线程分为两种:守护线程和普通线程。守护线程是JVM 自己使用的线程,比如垃圾回收(GC)就是一个守护线程。 普通线程一般是Java程序的线程,只要JVM中有普通线程在执行,那么JVM就不会停止。

JVM内存模型组成JVM内存模型主要由堆内存、方法区、程序计数器、虚拟机栈和本地方法栈组成。如下图:

 

 

其中,堆和方法区是所有线程共有的,而虚拟机栈,本地方法栈和程序计数器则是线程私有的。

java堆

《深入理解java虚拟机》中描述对堆的描述

所有的对象实例都存放在堆中。

1.Java1堆(Java Heap)是java虚拟机所管理的内存中最大的一块

2.java堆被所有线程共享的一块内存区域

3.虚拟机启动时创建java堆

4.java堆的唯一目的就是存放对象实例。

5.java堆是垃圾收集器管理的主要区域。

6.从内存回收的角度来看, 由于现在收集器基本都采用分代收集算 法, 所以Java堆可以细分为:新生代(Young)和老年代(Old)。 新生代又被划分为三个区域Eden、From Survivor, To Survivor 等。无论怎么划分,最终存储的都是实例对象, 进一步划分的目 的是为了更好的回收内存, 或者更快的分配内存。

7.java堆的大小是可扩展的, 通过-Xmx和-Xms控制。

8.如果堆内存不够分配实例对象, 并且对也无法在扩展时, 将会抛出outOfMemoryError异常。

java方法区

方法区与Java堆一样,是各个线程共享的区域,它用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译(JIT)后的代码等数据。

由于程序中所有的线程共享一个方法区,所以访问方法区的信息必须确保线程是安全的。如果有两个线程同时去加载一个类,那么只能有一个线程被允许去加载这个类,另一个必须等待。

在程序运行时,方法区的大小是可以改变的,程序在运行时可以扩展。同时,方法区里面的对象也可以被垃圾回收,但条件非常严苛,必须在该类没有任何引用的情况下才能被GC回收。

本地方法栈

栈作为一种线性的管道结构,遵循先进后出的原则。主要用于存储本地方法的局部变量表,本地方法的操作数栈等信息。当栈内的数据在超出其作用域后,会被自动释放掉。

本地方法栈是在程序调用或JVM调用本地方法接口(Native)时候启用。

Java类加载机制

什么是类加载

众所周知,JVM加载的是.class文件。其实,类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。

同时,JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class文件缺失或存在错误,类加载器会在程序首次主动使用该类时会生成错误报告(LinkageError错误),如果这个类一直没有被程序主动使用,那么类加载器就不会报告错误。

当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、连接、初始化3个步骤来对该类进行初始化。如果没有意外,JVM将会连续完成3个步骤,所以有时也把这个3个步骤统称为类加载或类初始化。

 

 

GC垃圾回收是对方法区、堆、本地方法栈的回收

转载于:https://www.cnblogs.com/l-x-x-y-d-j/p/11334164.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JVM的类加载是由类加载器及其子类实现的。类加载器是Java运行时系统的重要组成部分,负责在运行时查找和加载类文件中的类。在JVM中,类加载器按照一定的层次结构进行组织,每个类加载器负责加载特定位置的类。其中,启动类加载器(Bootstrap ClassLoader)是负责加载存放在<JAVA_HOME>/lib目录中的核心类库,如rt.jar、resources.jar等,同时也可以加载通过-Xbootclasspath参数指定的路径中的类库。启动类加载器是用C语言编写的,随着JVM启动而加载。当JVM需要使用某个类时,它会通过类加载器查找并加载这个类。加载过程会经历连接阶段,包括验证、准备和解析。在验证阶段,JVM会确保加载的类信息符合JVM规范。在准备阶段,JVM会为类变量分配内存并设置初始值,在方法区中分配这些内存。在解析阶段,JVM会根据符号引用替换为直接引用,以便后续的使用。通过类加载器的协同工作,JVM能够在运行时动态加载类,从而实现Java的灵活性和跨平台性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [JVM 的类加载原理](https://blog.csdn.net/ChineseSoftware/article/details/119212339)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [JVM类加载器](https://blog.csdn.net/rockvine/article/details/124825354)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值