JVM理论知识总结

本文深入探讨Java内存模型(JMM)的概念,解释其如何确保线程安全并统一内存访问。详细介绍了Java虚拟机(JVM)的内存结构,包括程序计数器、虚拟机栈、本地方法栈、方法区和堆的职责。此外,文章还讲解了垃圾回收(GC)机制,包括何时触发GC、哪些内存区域需要回收、垃圾回收算法(如标记清除、复制、标记整理、分代回收和分区回收)以及常用的垃圾收集器(如Parallel Collector、CMS Collector和G1收集器)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

是什么?

Java Virtual Machine Java虚拟机。

内存模型

基于线程安全提出的。

Java Memory Model,JMM。屏蔽掉各种硬件和操作系统的内存访问差异。

Java内存模型规定了所有的变量都存储在主内存中,每条线程还要自己的工作内存,线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝。线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量。不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主存来完成。

image.png

内存结构?

程序计数器:存放当前线程字节码指令地址,当线程切换后可以回到正确的位置。

 虚拟机栈:需要的数据,指令,要返回的地址,可以类比一个方法,需要的数据就是行参,指令就会逻辑代码,返回地址就是返回值。

本地方法栈:为执行本地方法服务的。

方法区:常量  静态变量 类信息

堆:对象

metaspace就是java8中方法区(永久代)的实现

什么时候回收? 

1。执行system.gc()手动调用gc方法的时候

2。堆区空间不足的时候,分为新生代空间不足触发minor gc,老年代空间不足触发full gc

哪些内存需要回收?

gc回收的是方法区和堆区。线程公有,其他三个都是线程私有,随线程终止而消失。

当一个对象通过引用计数法计数器为0或者可达性分析不可达的时候就需要进行回收。

引用计数法:

给一个对象添加一个引用计数器。每次有一个地方引用时,计数器加1,当失去引用时计数器减1。当计数器为0时说明对象不再使用。

此时A->B B->A,A和B互相引用计数器都为1,都不能被回收。 

public class Test{

    Object object1 = new Object(); //计数为1
    Object object2 = new Object(); //计数为1
    object1.ref = object2; //计数为2
    object2.ref = object1; //计数为2
    object1 = null; //计数为1
    object2 = null; //计数为2
}

可达性分析法:

通过一系列的根节点向下搜索,走过的路径被称为引用链,当一个对象到根节点没有任何一个引用链时,对象不可用。

解决了引用计数法的问题,但是不可达不一定会立刻回收,finalize方法会返回一次,重新建立引用连接。上图ABC都会回收。

 什么样的对象会成为根节点呢?

类加载器 常量 static成员变量

怎么回收?

垃圾回收算法

理论

标记清除

先标记可回收的对象,然后进行回收,产生碎片。

复制

先把内存分成大小相同的两块,每次只使用其中的一块,当这一块内存用完了,就将还存活的对象复制到另一块上面,然后把已使用过的内存空间一次清理掉,效率高,空间利用率不高,因为每次都只使用其中的一块内存。

标记整理

将所有存活的对象都向一端移动。没有内存碎片,时间长。

分代回收

yong区采用复制算法

old区采用标记清除或者标记整理算法

分区回收

把内存分成等份的区域,每个小空间可以单独使用,细粒度划分可以单独回收,减少了FullGC发生的频率。

垃圾收集器

进行垃圾回收。

Parallel Collector 并行收集器

不能一边进行垃圾回收一边工作,关注吞吐量

并行说的是可以有多个线程同时执行垃圾回收,此时用户线程等待。吞吐量高(用户线程时间/用户线程时间+垃圾回收时间),用户线程时间执行的时间长。 

CMS Collector 并发收集器

关注响应时间,并发。

垃圾回收线程和用户工作线程可以同时执行,用户工作线程的时间短,响应时间短。

G1收集器

分区算法

垃圾区搭配使用

JVM运行流程

java里面最小的单元是线程。

一个类要运行的时候首先经过class编译成字节码文件,类加载,连接,扔到JVM(运行时数据区)进行初始化,使用,卸载。

JVM基本结构

类加载器, 执行引擎, 运行时数据区,本地接口 ,本地方法库

类加载过程 

jvm把class文件加载到内存,并对数据进行校验,解析和初始化,最终形成jvm可以直接使用的java类型。

加载:通过ClassLoader加载class文件字节码,生成Class对象

链接:分为校验,转备和解析(不是必须的)。

验证:检查加载的class的正确性和安全性

准备:为类变量分配存储空间并设置类变量初始值

解析:JVM将常量池中的符号引用转换为直接引用

初始化:执行类变量赋值(用static修饰的变量)和静态代码块(static方法)

类加载器

在类加载成class对象的时候起作用。

类名.class.classloader打印当前的加载器 

启动加载器

BootStrap Classloader  主要加载  rt.jar

扩展类加载器

Extension Classloader extends classloader 加载  java/home/lib/ext*.jar

应用类加载器

App Classloader extends Classloader 加载 classpath中的类库

自定义类加载器

extends classloader 完全自定义加载路径

这四种类加载器从上到下是父子关系,但是不是继承关系,是组合关系,就是成员变量。在自类加载器里有父类的变量就是组合关系。

双亲委派模型

loadclass (从classloader中查看源码)

parent是类变量,这里体现的不是继承关系。

类加载之前先查询是否被加载过,如果有则返回,否则为null,往下执行。当parent!=null 的时候调用父类的loadclass()方法查询是否被加载过一直反复执行这个方法,当时启动类加载器BootStrap Classloader的时候parent= null,查询启动类加载器是否加载过这个类,如果没有在启动类加载器里寻找是否有这个类文件如果还是没有,到下面的if(c==null)在扩展,应用类加载器里查找是否有这个类文件,此时还没有就调用子类自己写的findclass方法,表面是findclass(),实际上真正加载的是defineclass()这个方法。 

JVM锁分类

偏向锁

轻量级锁

重量级锁

自旋锁

内容概要:本文详细探讨了基于MATLAB/SIMULINK的多载波无线通信系统仿真及性能分析,重点研究了以OFDM为代表的多载波技术。文章首先介绍了OFDM的基本原理和系统组成,随后通过仿真平台分析了同调制方式的抗干扰性能、信道估计算法对系统性能的影响以及同步技术的实现与分析。文中提供了详细的MATLAB代码实现,涵盖OFDM系统的基本仿真、信道估计算法比较、同步算法实现和同调制方式的性能比较。此外,还讨论了信道特征、OFDM关键技术、信道估计、同步技术和系统级仿真架构,并提出了未来的改进方向,如深度学习增强、混合波形设计和硬件加速方案。; 适合人群:具备无线通信基础知识,尤其是对OFDM技术有一定了解的研究人员和技术人员;从事无线通信系统设计与开发的工程师;高校通信工程专业的高年级本科生和研究生。; 使用场景及目标:①理解OFDM系统的工作原理及其在多径信道环境下的性能表现;②掌握MATLAB/SIMULINK在无线通信系统仿真中的应用;③评估同调制方式、信道估计算法和同步算法的优劣;④为实际OFDM系统的设计和优化提供理论依据和技术支持。; 其他说明:本文仅提供了详细的理论分析,还附带了大量的MATLAB代码示例,便于读者动手实践。建议读者在学习过程中结合代码进行调试和实验,以加深对OFDM技术的理解。此外,文中还涉及了一些最新的研究方向和技术趋势,如AI增强和毫米波通信,为读者提供了更广阔的视野。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值