首页 > 其他分享 >jvm学习

jvm学习

时间:2023-10-15 19:35:36浏览次数:33  
标签:Java JVM 回收 学习 GC 内存 jvm 加载

一、什么是JVM

JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。

Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够“一次编译,到处运行”的原因。

二、JVM的组成

 

 

 

1、Class Loader 类加载器

类加载器的作用是加载类文件到内存,比如编写一个HelloWord.java 程序,然后通过javac 编译成class 文件,那怎么才能加载到内存中被执行呢?Class Loader 承担的就是这个责任,那不可能随便建立一个.class 文件就能被加载的,Class Loader 加载的class 文件是有格式要求。

Class Loader 只管加载,只要符合文件结构就加载,至于说能不能运行,则不是它负责的,那是由Execution Engine 负责的。

2、Execution Engine 执行引擎

执行引擎也叫做解释器(Interpreter) ,负责解释命令,提交操作系统执行。

3、Native Interface 本地接口

本地接口的作用是融合不同的编程语言为Java 所用,它的初衷是融合C/C++ 程序,Java 诞生的时候是C/C++ 横行的时候,要想立足,必须有一个聪明的、睿智的调用C/C++ 程序,于是就在内存中专门开辟了一块区域处理标记为native 的代码,它的具体做法是Native Method Stack 中登记native 方法,在Execution Engine 执行时加载native libraies 。目前该方法使用的是越来越少了,除非是与硬件有关的应用,比如通过Java 程序驱动打印机,或者Java 系统管理生产设备,在企业级应用中已经比较少见,因为现在的异构领域间的通信很发达,比如可以使用Socket 通信,也可以使用Web Service 等等,不多做介绍。

4、 Runtime data area 运行数据区

运行数据区是整个JVM 的重点。我们所有写的程序都被加载到这里,之后才开始运行,Java 生态系统如此的繁荣,得益于该区域的优良自治。

整个JVM 框架由加载器加载文件,然后执行器在内存中处理数据,需要与异构系统交互是可以通过本地接口进行,瞧,一个完整的系统诞生了!

三、JVM的内存管理

所有的数据和程序都是在运行数据区存放,它包括以下几部分:

1、 Stack 栈

栈也叫栈内存,是Java程序的运行区,是在线程创建时创建,它的生命期是跟随线程的生命期,线程结束栈内存也就释放,对于栈来说不存在垃圾回收问题,只要线程一结束,该栈就Over。问题出来了:栈中存的是那些数据呢?又什么是格式呢?

栈中的数据都是以栈帧(Stack Frame)的格式存在,栈帧是一个内存区块,是一个数据集,是一个有关方法(Method)和运行期数据的数据集,当一个方法A被调用时就产生了一个栈帧F1,并被压入到栈中,A方法又调用了B方法,于是产生栈帧F2也被压入栈,执行完毕后,先弹出F2栈帧,再弹出F1栈帧,遵循“先进后出”原则。

那栈帧中到底存在着什么数据呢?栈帧中主要保存3类数据:本地变量(Local Variables),包括输入参数和输出参数以及方法内的变量;栈操作(Operand Stack),记录出栈、入栈的操作;栈帧数据(Frame Data),包括类文件、方法等等。

2、Heap 堆内存

jvm中分为堆和方法区,堆又进一步分为新生代和老年代,方法区为永久代。

堆中区分的新生代和老年代是为了垃圾回收,新生代中的对象存活期一般不长,而老年代中的对象存活期较长,所以当垃圾回收器回收内存时,新生代中垃圾回收效果较好,会回收大量的内存,而老年代中回收效果较差,内存回收不会太多。

基于以上特性,新生代中一般采用复制算法,因为存活下来的对象是少数,所需要复制的对象少,而老年代对象存活多,不适合采用复制算法,一般是标记整理和标记清除算法。

因为复制算法需要留出一块单独的内存空间来以备垃圾回收时复制对象使用,所以将新生代分为eden区和两个survivor区,每次使用eden和一个survivor区,另一个survivor作为备用的对象复制内存区。

一个JVM实例只存在一个堆类存,堆内存的大小是可以调节的。类加载器读取了类文件后,需要把类、方法、常变量放到堆内存中,以方便执行器执行,堆内存分为三部分:

Permanent Space 永久存储区

永久存储区是一个常驻内存区域,用于存放JDK自身所携带的Class,Interface的元数据,也就是说它存储的是运行环境必须的类信息,被装载进此区域的数据是不会被垃圾回收器回收掉的,关闭JVM才会释放此区域所占用的内存。

Young Generation Space 新生区

新生区是类的诞生、成长、消亡的区域,一个类在这里产生,应用,最后被垃圾回收器收集,结束生命。新生区又分为两部分:伊甸区(Eden space)和幸存者区(Survivor pace),所有的类都是在伊甸区被new出来的。幸存区有两个: 0区(Survivor 0 space)和1区(Survivor 1 space)。当伊甸园的空间用完时,程序又需要创建对象,JVM的垃圾回收器将对伊甸园区进行垃圾回收,将伊甸园区中的不再被其他对象所引用的对象进行销毁。然后将伊甸园中的剩余对象移动到幸存0区。若幸存0区也满了,再对该区进行垃圾回收,然后移动到1区。那如果1区也满了呢?再移动到养老区。

Tenure generation space养老区

 

3、 Method Area 方法区

方法区是被所有线程共享,该区域保存所有字段和方法字节码,以及一些特殊方法如构造函数,接口代码也在此定义。

4、PC Register 程序计数器

每个线程都有一个程序计数器,就是一个指针,指向方法区中的方法字节码,由执行引擎读取下一条指令。

5、Native Method Stack 本地方法栈

四、JVM垃圾回收

GC (Garbage Collection)的基本原理:将内存中不再被使用的对象进行回收,GC中用于回收的方法称为收集器,由于GC需要消耗一些资源和时间,Java在对对象的生命周期特征进行分析后,按照新生代、旧生代的方式来对对象进行收集,以尽可能的缩短GC对应用造成的暂停

(1)对新生代的对象的收集称为minor GC;

(2)对旧生代的对象的收集称为Full GC;

(3)程序中主动调用System.gc()强制执行的GC为Full GC。

不同的对象引用类型, GC会采用不同的方法进行回收,JVM对象的引用分为了四种类型:

(1)强引用:默认情况下,对象采用的均为强引用(这个对象的实例没有其他对象引用,GC时才会被回收)

(2)软引用:软引用是Java中提供的一种比较适合于缓存场景的应用(只有在内存不够用的情况下才会被GC)

(3)弱引用:在GC时一定会被GC回收

(4)虚引用:由于虚引用只是用来得知对象是否被GC

标签:Java,JVM,回收,学习,GC,内存,jvm,加载
From: https://www.cnblogs.com/1011-zslnb/p/17766003.html

相关文章

  • Linux第11章学习笔记
    第十一章学习笔记##EXT2文件系统多年来,Linux一直使用EXT2作为默认文件系统EXT3是EXT2的拓展。EXT3中增加的主要内容是一个日志文件EXT4的主要变化是磁盘块的分配EXT2文件系统数据结构通过mkfs创建虚拟磁盘创建了一个带有nblocks个块(每个块大小blksize字节)和ninodes个索引......
  • 第六周学习笔记(学习笔记5)
    第十一章EXT2文件系统—学习笔记〇、本章思维导图一、文件系统数据结构通过mkfs创建虚拟磁盘在Linux下,命令mke2fs[-bblkesize-Nninodes]devicenblocks在设备上创建一个带有nblocks个块(每个块大小为blksize字节)和ninodes个索引节点的EXT2文件系统。设备可以是真实......
  • 2023-2024-1 20231304 《计算机基础与程序设计》第三周学习总结
    2023-2024-120231304《计算机基础与程序设计》第三周学习总结作业信息这个作业属于哪个课程2023-2024-1计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第三周作业这个作业的目标学习计算机概论第二三章并完成云班课测试作业正文20......
  • 2023-2024-1 20211327 信息安全系统设计与实现 学习笔记5(必做)
    学习笔记5EXT2文件系统概述1级和2级文件系统函数实践过程EXT2文件系统概述EXT2(SecondExtendedFileSystem)是Linux操作系统早期使用的文件系统,它是EXT文件系统家族的第二个版本,于1993年首次引入。在现代Linux系统中已经被后续版本的EXT文件系统(如EXT3和EXT4)所取代。1.......
  • Vue的学习
    为什么需要前端框架当前前端开发的状态前端基础语言html:构建页面内容结构css:美化和布局页面内容Javascript:提供交互能力和动态三者整合就是我们看到的网页页面---所有的页面和页面功能都能完成现在能做什么浏览器展示的网页+小程序网站,网页游戏等等当前的状态有什么问题基......
  • 2023-2024-1 20231305 《计算机基础与程序设计》第三周学习总结
    2023-2024-120231305《计算机基础与程序设计》第三周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2022-2023-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(如2022-2023-1计算机基础与程序设计第一周作业)这个作业的目标<自学教材并完......
  • 2023-2024-1 20231422徐清恬《计算机基础与程序设计》第三周学习总结
    这个作业属于哪个课程2023-2024-计算机基础与程序设计这个作业要求在哪里2023-2024-计算机基础与程序设计这个作业的目标自学计算机科学概论第2章,第3章,《C语言程序设计》第2章作业正文(https://www.cnblogs.com/Augenstern4545/p/17765954.html)教材学习内容......
  • 2023-2024-1 20231418 《计算机基础与程序设计》第3周学习总结
    作业信息这个作业属于哪个课程<班级的链接>(如[2023-2024-1-计算机基础与程序设计](https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP)这个作业要求在哪里<作业要求的链接>(如2023-2024-1计算机基础与程序设计第三周作业这个作业的目标<自学教材:计算机科学概论......
  • 学习笔记5 截图+代码
    一、苏格拉底挑战二、遇见的困难三、实践截图和代码课堂笔记:man3printfman-ksort//会找到含有sort功能的命令或函数man-ksort|grep3//缩小查找范围到C语言命令课本练习:#include<stdio.h>#include<stdlib.h>#include<stdint.h>#defin......
  • 《信息安全系统设计与实现》学习笔记5
    《信息安全系统设计与实现》学习笔记5第十一章EXT2文件系统EXT2文件系统数据结构创建虚拟硬盘mke2fs[-bblksize-Nninodes]devicenblocks虚拟磁盘布局Block#0:引导块超级块Block#1:B1是超级块,用于容纳整个文件系统的信息,是记录整个文件系统相关信息的......