深度了解Jvm原理和GC回收(一万字)

GC垃圾回收机制总结 本文参考(https://github.com/jeanboydev/Android-ReadTheFuckingSourceCode/blob/master/article/java/jvm/JVM-垃圾回收机制.md) (https://blog.youkuaiyun.com/u013630349/article/details/78342645)文章,如若侵权请通知删除。 最近面试一直会被问到关于GC的... 阅读详情

带你全面了解Jvm原理GC回收

什么是Jvm

JVM是Java虚拟机。它是由一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域组成。 JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行,由于不同系统都有对应相同版本的Java虚拟机,各自系统的虚拟机都可以识别并编译自己的字节码文件,这也就实现了Java的跨平台这一大特性。

JRE/JDK/JVM的关系

  • JRE称为Java运行环境。这就表明了,所有的Java程序都要在有JRE的情况下才能运行。

  • JDK称为Java开发环境。是程序开发者用来编译、调试java程序用的开发工具包。JDK的工具也是Java程序,也需要JRE才能运行。为了保持JDK的独立性和完整性,在JDK的安装过程中,JRE也是 安装的一部分。所以,在JDK的安装目录下有一个名为jre的目录,用于存放JRE文件。

  • JVM是JRE的一部分。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java语言最重要的特点就是跨平台运行。使用JVM就是为了支持与操作系统无关,实现跨平台。

JVM原理

Jvm是Java的核心和基础,在Java编译器和Os平台之间的虚拟处理器。它是利用软件方法实现的抽象的计算机基于下层的操作系统和硬件平台,可以在上面执行Java的字节码程序。

在这里插入图片描述

Jvm的体系结构

在这里插入图片描述

  • 类装载器:用来装载.class文件
  • 执行引擎:执行字节码,或者本地方法
  • 运行时数据区:内存空间中的方法区,堆,Java栈,Pc寄存器和本地方法栈。
  • 方法区:称为“永久代”,“非堆”,用于存储虚拟机加载的类信息,常量,静态变量,是各个线程共享的区域,是*线程共享*的
  • 运行时常量池:方法区的一部分,Class文件中除了有类的版本,字段,方法,接口等描述信息外,还有一项信息就是常量池,用于存放编译器生成的各种符号引用,这部分内容将在类加载后放到方法区的运行时常量池中。
  • 虚拟机栈:当每个方法被执行的时候,都会创建一个栈用于存储局部变量,参数,操作栈,方法出口等信息。每个方法被调用到执行完成的过程,就对应着一个栈在虚拟机中从入栈到出栈的过程。生命周期和线程相同,是*线程私有*的
  • 本地方法栈:与虚拟机栈基本类似,是为本地方法服务的,是*线程私有*的
  • 堆:又称为GC堆,是JVM内存模块中最大的一块内存区域,是线程共享的,在Jvm启动时创建。存放了所有的实例对象以及数组值,既所有刚new的对象都在堆里。由于堆是线程共享的,因此在进行对象内存的分配的时候都要进行加锁,这也就导致了new对象的开销是比较大的
  • 程序计数器:这是内存区域中最小的一块内存,他的作用是当前线程所执行的字节码的行号指示器,在虚拟机的模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支,循环,异常处理,线程恢复等基础功能都需要依赖计数器完成,是*线程私有*的。

对象是否存活的判定算法

由于方法区和堆是线程共享的,并不像虚拟机栈,程序计数器和本地方法栈是线程私有的。所以方法区和堆可以和GC回收扯上关系。

由于在堆中存在在所有的对象,所以在Gc回收之前都要考虑,哪些对象还活着,哪些对象已经死了,活着就让他继续活着,死了就让回收他。这时候就存在了某些算法来通过判断对象的存活状态从而判断是否该被回收。

1. 引用计数算法

给对象中添加一个引用计数器,每当一个地方应用了对象,计数器就加一;当引用失效的时候,计数器就减一;通过这样的加加减减,当计数器变为0的时候就表示该对象已死,可以进行回收操作。

  • 缺点:很难解决两个对象之间相互循环引用的情况
2. 可达性分析算法

通过一系列称为“GC Roots"的对象作为起点,从这些节点开始向下搜索,搜索所走过的路劲称为引用链,当一个对

JVM垃圾回收(GC)深度解析:原理、调优与问题排查 垃圾回收是JVM自动识别并释放"无用对象"所占用内存的过程。"无用对象"指的是不再被任何存活对象引用的对象,这些对象占据的内存若不及时释放,最终会导致OOM(OutOfMemoryError)。JVM垃圾回收是Java应用性能的核心影响因素,除了常见的频繁YGC和Full GC,GC停顿过长、元空间异常等问题同样可能成为系统瓶颈。理解GC原理、掌握各类问题的排查方法是高级Java工程师的必备技能。面对GC问题时,需结合监控工具、日志分析和代码审查,精准定位问题根源——是参数配置不合理,还是代码存在内存泄漏。 阅读详情

相关推荐

[Java JVM] Hotspot GC研究- 什么是GC Root

GC RootGC Root全称是garbage collection root, 即垃圾回收的根. 回到我们的葡萄比喻上来, 也就是一串葡萄的柄. 实际上JVM中的GC Root不只一个, 也就是多个这样的 “柄”. 来看看hotspot网站的解释: garbage collection root A pointer into the Java object heap from ou

lqp276的博客 2222

Ubuntu 20.04 server 安装

Ubuntu 20.04 server 安装 前面我们介绍了 Ubuntu Desktop 版本的安装,今天我们来看看 Ubuntu server 版本的安装。Ubuntu Server 版本的安装和 Desktop 有很大的区别,并且全程不能使用鼠标,只能通过键盘。 从光盘或 U 盘启动到 Welcome 界面,选择语言,一般都是使用 English,所以保保持默认,直接按回车即可; 系统检测到了新的版本,问你是否是否更新,这里我们不需要安装新的版本,所以选项 Continue without upda

as900的博客 1万+

MIT 6.824分布式 LAB4A:ShardCtrler

lab 4要求实现一个使用raft共识算法的分片存储系统。而在lab 4a中,我们仅需实现分片控制器的功能。lab4中的分片存储系统有多个分片,这些数据分布在众多分片上,而每个分片都对应着一个集群组,可能一个集群组负责多个分片,一个集群组内的所有服务器都会使用raft共识算法进行状态的复制。而本实验的重点为分片控制器,主要负责的工作是对集群组和分片之间关系的管理,我们仅需在/src/shardctrler文件夹中对client.go,server.go,common.go这三个文件进行修改即可。注意事项(实

MarksSa的博客 832

【PT+Arduino+OneNET基础教程1】PacketTracer中MCU芯片编程教程(零基础入门)

PacketTracer软件内MCU芯片编程入门 零基础

ChloeMax_的博客 9455

Matlab编码转换实战:从GBK到UTF-8的完整解决方案

本文提供Matlab编码转换的完整实战方案,重点解决GBK与UTF-8编码冲突导致的中文乱码问题。通过修改系统配置文件、批量转换项目文件及设置默认保存编码,实现从GBK到UTF-8的彻底迁移,并分享常见避坑指南与自动化脚本技巧,确保代码跨平台协作的稳定性。

weixin_29031057的博客 325

自动化学报latex模板——ctex2.4.6和ctex2.9.2直接使用步骤

自动化学报latex模板——ctex2.4.6和ctex2.9.2直接使用步骤 1.背景及问题 最近在使用自动化学报latex模板写作业时,一只对latex搞不清楚,网上关于各种版本的latex下载了一堆(比如ctex中文套装方案的各个版本及texlive+texstudio方案,中间还升级了miktex,windet等),发现都未能成功编译出来自动化学报的latex模板,反正开始头很大!!!最后终于没忍住打开了: 自动化学报官网下载模板链接,因为我就要用latex模板(不能服输!)找到的解决方案是:使用

QIANFANGshiwo的博客 7709

睿尔曼超轻量仿人机械臂-ROS第一篇 启动机械臂的Moveit

本文主要讲述了睿尔曼六轴机械臂在ROS中的功能包配置,及如何根据文件启动Moveit做仿真。

realman_Rop的博客 7490

EMC中的RE测试与整改

测试主要测试电子、电气设备或系统在正常工作时自身对外界的辐射干扰强度,包括来自电路板、机箱、电缆及连接线等所有部件的辐射骚扰。分为:磁场辐射和。其中后者较为应用普遍。测试频段根据不同标准要求不一致。手机测试的频段主要为30-1000MHZ。需要注意的是设备在进行RE测试时要求尽可能满配置,满负荷的运行。同时RE也是EMC中的难点。

学海无涯的专栏 1670

头歌OpenGauss数据库-G.视图的使用

OpenGauss数据库-G.视图的使用

python一生之敌的博客 1384

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

上一篇: JavaWeb之Servlet介绍
下一篇: Mybatis多表联合查询,嵌套查询,动态SQL
Debug_EDM
博客等级 码龄8年 21粉丝 47原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值