Java后端开发三年,你不得不了解的JVM

OpenCV入门(一)Python环境的搭建 因为有点Python基础,并且Python是比较好入门的编程语言,所以,机器视觉后面打算在Python这个平台下进行。 阅读详情

JAVA程序员,三年是个坎,如果过了三年你还没有去研究JVM的话,那么你这个程序员只能是板砖的工具了。下面来个JVM的解析可好?

JVM是Java Virtual Machine(Java虚拟机)的缩写,也就是指的JVM虚拟机,属于是一种虚构出来的计算机,在我们实际的电脑上来进行模拟各种计算机的功能的这么个东西。

因为有了JVM的存在,搞JAVA的不再需要去关心什么时候去释放内存,也不会像C++程序员那样为了一点点内存而惆怅,对就是你,JVM虚拟机帮你把这些东西都完成了,那么我们来说说JAVA的JVM吧!

我们先来看看JVM的模型吧,之前在百度上看文档,上面就说了几个,方法区,堆,栈,计数器。没了,很难受,于是看了深入理解JVM的书,也算是有点体会。

在深入理解JVM一书中提到,JVM运行时的数据区域会划分为几个不同的区域,有方法区(Method Area),虚拟机栈(VM Stack),本地方法栈(Native Method Stack),堆(heap),程序计数器(Program Counter Register),下面就是书中的图:

 

咱们一个一个来解释: 先说程序计数器(Program Counter Register):程序计数器实际上就是用于存放下一条指令所在地址的地方,当我们执行一条指令的时候,要先知道他存放的指令位置,然后把指令带到寄存器上这是就是获取指令,然后程序计数器中的存贮地址会加1,然后这样子循环的去执行,而且程序计数器这个小的内存区是“线程私有的内存”。

为什么会是私有的呢?,在深入理解JVM一书中说的是虚拟机的多线程通过线程的轮流切换来切换分配处理器的执行时间的方式来实现,说起来其实很拗口的,其实也就是说一个处理器,同一个时刻,只会执行一个线程的指令,但是时间可能不均衡,可能第一分钟在a线程,第二分钟就去执行b线程了,但是呢,为了保证切换回来还需要是一致的,那么每个线程中就会有一个独立存在的程序计数器,独立来存贮,为了保证不影响。所以他是一个“线程私有的内存”。

程序计数器还有几个特点:

  • 如果线程正在执行的是Java 方法,则这个计数器记录的是正在执行的虚拟机字节码指令地址。
  • 如果正在执行的是Native 方法,则这个计数器值为空(Undefined)。
  • 此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

分别解释一下这三句话吧,这是深入理解java虚拟机中的原话,第一句好像已经很直白了,没的说,来说说第二句话吧

因为这个计数器记录的是字节码指令地址,但是Native(本地方法);就比如说(System.currentTimeMillis())他是通过C来实现,直接通过系统就能直接调用了不需要去编译成需要执行的字节码指令的话,那么就相当于不过程序计数器,它没有记录的话,那他的计数器的值就肯定为空了。

第三句话 我们可以试试编译一小段代码,然后反编译出来看看

 

也就是实际上是这个样子的

public class Test{ public int test(){ int a = 10; //0 ...... int b = 20; //3....... int c = 30; //6...... return (a+b)*c; //11.... 13.... 14...执行加减乘除操作 } }

上面的0,2,3,5,6,8....就是指令的偏移地址bipush就是入栈指令, 在执行到test方法的时候,线程就会创建对应的程序计数器在计数器中放0,2,3,5,6,8....这些指令地址,所以计数器里改变的不是内存的大小,它也就没有溢出了。

下面我们再来说一下:JAVA虚拟机栈(VM Stack)

线程私有,生命周期和线程一样,这个虚拟机栈描述的是JAVA方法执行的内存模型,用于存局部变量,操作数栈,方法出口等信息的,上面那个bipush就是入栈指令,在这里最需要注意的就是他存放的是什么数据.局部变量里面放的就是那些我们所知道的基本的数据类型,对象引用的话那就是一个地址。

在虚拟机规范里面还说,他的2个异常状况:

  • 一个是StackOverflowError异常,栈内存溢出,这肯定很容易理解,就是栈的内存不够,你的请求线程太大。(固定长度的栈)
  • 如果说在动态扩展的过程中,申请的长度还是不够,那么会抛出另外一个异常OutOfMemoryError异常。

本地方法栈(Native Method Stack) :

它和虚拟机栈很类似,区别就在于虚拟机栈执行的是JAVA方法,但是本地方法栈则是Native方法,其他的没啥不同就连抛出异常都一样的。

JAVA堆(heap) 在JVM一书中也有提到,Heap是在JAVA虚拟机中内存占用最大的一个地方,也是所有线程共享的一个内存区域,堆内存中主要就是用于存放对象实例的。

几乎是所有的对象实例都在这里分配内存,JAVA堆是垃圾收集器管理的主要区域,那么现在重点来了,面试中问到最多的垃圾回收机制接下来就要仔细说说了。

内存回收,现在都是进行的分代算法,堆中也是,新生代,老年代,而且两种垃圾回收机制是采用的不同的回收机制的,在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。

而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用"标记-清理"或"标记-压缩"算法来进行回收,说回收机制先看看heap的分区(这个from和to 并不是绝对的,看对象处在哪个位置,GC的次数不一样之后,那from和to会有相应转变)

 

分区一目了然,下面研究一下算法实现吧

Minor GC:GC新生代,

Full GC:老年代GC,

因为新生代中对象的存活率比较低,所以一般采用复制算法,老年代的存活率一般比较高,一般使用”标记-清理”或者”标记-整理”算法进行回收。

看了有几天才明白啥意思,我说说我自己的见解吧,还是画图吧,

Minor GC:

我们每次new对象的时候都会先在新生代的Enden区放着也就是最开始 是这样子的

 

然后在Enden用完的时候里面会出现待回收的

 

然后就来了把存活的对象复制放到Survior1(from)中,待回收的等待给他回收掉 就是这样的

 

然后把Enden区清空回收掉

 

这样的话 第一次GC就完成了,下面再往下走

当Enden充满的时候就会再次GC

先是这个样子的

 

然后会把 Enden和Survoir1中的内容复制到Survior中,

 

然后就会把Enden和Survior进行回收

 

然后从Enden中过去的就相当于次数少的,而从Survior1中过去的就相当于移动了2次

 

这样新生代的GC就执行了2次了,

当Enden再次被使用完成的时候,就会从Survior2复制到Survior1中,

接下来是连图

 

经过回收之后Surior1就变了,1对象是从Enden直接复制过来的,2对象是Enden-->Survior2-->Survior1 ,3对象则是从Enden-->Surivior1-->Survior2-->Survior1 复制过来的,这样一步一步的执行下去的时候,就是新生代的GC。

既然这样,那为什么还会存在老年代呢?其实如果GC在执行的时候有些对象一直没有被回收,那么他移动次数就会无限的累计,每次从Surior(from)到Surior(to)的过程中就相当于又增加了一次移动,当他达到一定的次数的时候(默认是15),就会移动到老年代里了,所以不存在不会被回收的对象,但是这个次数可以设置的,

-XX:MaxTenuringThreshold

就类似这样子

 

其实上边的这只是一种情况,还有就是如果对象太大,存不下,那就直接会进入老年代。

还有那种默认就是长期活着的也会进入老年代,

而且这种复制算法的垃圾回收机制是比较浪费内存的,每次都会有一块内存区是闲着不干活的,但是优点很明显,简单高效

以上就是GC中垃圾回收中的新生代复制算法解析,新生代的Minor GC也算是知道了不少东西了,以上就是一些个人的见解,图比较清晰,容易理解,有不对的地方希望能够各位同行指点一下。

如果你对技术提升很感兴趣,欢迎1~8年的工程师可以加入我的Java进阶之路来交流学习:585550789。里面都是同行,有资源共享,还有大量面试题以及解析。欢迎一到五年的工程师加入,合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

硬件电路设计采集电路 摘要:采集电路是硬件设计中连接物理世界与数字系统的关键环节,主要用于将温度、压力等物理量转换为电信号。常见的采集电路包括模拟量采集(如温度、电压)、数字量采集(如开关状态)和特殊信号采集(如光、声音)。设计时需重点关注传感器选型、信号调理、电源接地、抗干扰和ADC配置等核心要素,确保信号链路的完整性和稳定性。合理的电路设计需结合具体应用场景,通过仿真和测试验证性能,最终实现精确可靠的数据采集。 阅读详情

相关推荐

VisionMaster字符检测避坑指南:为什么你的缺陷检测总误判?7个参数陷阱详解

本文深入剖析了海康VisionMaster在字符缺陷检测中导致误判的7个关键参数陷阱,包括二值化参数、最小字符面积与宽度、字符极性及缺陷判决参数等。通过药品喷码和PCB丝印等实战案例,提供了系统的调试心法与工作流,帮助工程师精准调参,有效降低误判率,提升检测稳定性。

rust6ferris的博客 1099

【规划】常用算法大汇总

常用规划算法一、图搜索1. DFS&BFS、GBFS2. Dijkstra算法和A*算法3. A*变种3.1 混合A*算法3.2 LPA*算法3.3 其它二、采样1. 随机性采样1.1 PRM算法1.2 RRT算法1.3 RRT算法的变种(1) Bidirectional RRT / RRT Connect(2) RRT *(3) kinodynamic-RRT*(4) Any-Time RRT*(5) Informed RRT*2. 确定性采样2.1 控制空间采样2.2 状态空间采样三、优化 一、

糊涂懿的博客 3392

工业自动化实战:用LabVIEW的DSC模块实现MODBUS-TCP设备控制

本文详细介绍了如何利用LabVIEW的DSC模块实现工业自动化中的MODBUS-TCP设备控制。通过环境准备、核心功能解析、状态机实现及典型工业场景实战,帮助工程师快速掌握稳定可靠的通讯技术,提升工业自动化系统的运行效率。

salt9的博客 1057

JavaWeb开发(后端Web开发【一】)

什么是MavenMaven是apache旗下的一个开源项目,是一款用于管理和构建java项目的工具。ApacheApache 软件基金会,成立于1999年7月,是目前世界上最大的最受欢迎的开源软件基金会,也是一个专门为支持开源项目而生的非盈利性组织。Maven的作用依赖管理:方便快捷的管理项目依赖的资源(jar包),避免版本冲突问题统一项目结构:提供标准,统一的项目结构项目构建:标准跨平台(Linux、Windows、MacOS)的自动化项目构建方式Maven介绍。

又菜又爱玩的小熊 9562

GPD源码分析

gpd使用示例 先看下面一段代码,为标准gpd算法的使用方法,可以看到输入为点云,cloud_camera_; 输入:std::unique_ptr<gpd::util::Cloud> cloud_camera_ 输出: std::vector<std::unique_ptr<gpd::candidate::Hand>> grasps; // detect grasp poses gpd对象:std::unique_ptr<gpd::GraspDetect.

weixin_41003113的博客 2334

鸿蒙OS开机动画背后的秘密:从代码到视觉的完整解析(附源码分析)

本文深入解析了鸿蒙OS开机动画的系统级实现原理。从bootanimation服务的启动配置、与Render Service的协同,到基于VSync信号的帧率同步与绘制流水线,结合OpenHarmony源码进行了逐行解读。文章揭示了其事件驱动的优雅退出机制,并探讨了视频支持、多屏适配等高级特性与定制化可能,为开发者理解鸿蒙图形子系统提供了硬核技术视角。

sony5的博客 972

Java:企业级java后端开发,需要掌握哪些内容

后端开发是指开发基于服务器端的软件应用程序,也称为系统的后台或服务器端编程。后端程序员负责处理网站或应用程序后台的逻辑和功能,包括数据库管理、服务器端脚本编写、API设计、数据安全性、网站性能优化等。后端开发技术通常包括网络协议、服务器架构、数据库管理、编程语言和框架等方面的知识。具有优秀的后端开发技能的程序员能够创建高效、高可用性、安全和具有良好扩展性的应用程序。

snow的博客 8554

如何通过 Python 爬虫抓取并分析政府开放数据

通过本文的介绍,我们展示了如何使用Python 爬虫抓取并分析政府开放数据。通过requests获取政府开放数据的 API 接口数据。使用和pandas进行数据清洗与存储。使用matplotlib对数据进行可视化。你可以根据不同的政府开放平台和数据集进行调整,应用于不同领域的数据分析,如公共健康、交通、环保等。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1077

JAVA后端开发(Java基础)Day01

主要讲解Java后端开发知识,从小白(零基础)开始,到精通Java后端开发,逐步进行讲解,欢迎了解!

weixin_53905273的博客 3864

IgH EtherCAT 从入门到精通:第 29 章 实战:EoE 远程维护通道搭建

摘要:本章详细介绍了基于EoE(Ethernet over EtherCAT)协议的远程维护通道搭建方案。主要内容包括:1)网络架构设计,采用管理网络与EoE子网隔离的方案;2)从站EoE支持确认与IP地址配置,提供API和命令行两种方式;3)路由/交换两种部署模式,重点推荐路由模式并给出自动化配置脚本;4)SSH远程访问配置,包括直接连接和跳板访问两种方式;5)安全加固措施,如防火墙规则、SSH密钥认证等;6)故障恢复机制与性能注意事项。该方案实现了通过EtherCAT网络对从站设备的远程SSH访问、文件

从事嵌入式linux android驱动开发,拥有全栈能力 360

matplotlib保存图片设置分辨率总是96dpi,好烦躁,教你一招轻松解决

matplotlib保存图片设置分辨率总是96dpi,好烦躁,教你一招轻松解决 目录 matplotlib保存图片设置分辨率总是96dpi,好烦躁,教你一招轻松解决 #使用plt.savefig("cm.png",dpi = 300)为什么不管用 #plt.rcParams也不管用 #解决方案 在做论文的过程中,许多期刊或者会议对图片的分辨率有明确的要求,例如,dpi=300。 之前画曲线图都是采取保存方式为savefig(dpi=300),然后查看保存图片的属性信息,然而你看到的现象是

data+scenario+science+insight 8800

java三年_Java后端开发三年,你不得不了解的JVM

喜欢的朋友可以关注下专栏:Java架构技术进阶。里面有大量batj面试题集锦,还有各种技术分享,如有好文章也欢迎投稿哦。JAVA程序员,三年是个坎,如果过了三年你还没有去研究JVM的话,那么你这个程序员只能是板砖的工具了。下面来个JVM的解析可好?JVM是Java Virtual Machine(Java虚拟机)的缩写,也就是指的JVM虚拟机,属于是一种虚构出来的计算机,在我们实际的电脑上来进行模...

weixin_35604021的博客 175

基于python CNN卷积神经网络模型实现6类别垃圾分类 毕业设计 附完整代码数据

基于python CNN卷积神经网络模型实现6类别垃圾分类 毕业设计 附完整代码数据

1665

java jvm_Java后端开发三年,你不得不了解的JVM

JAVA程序员,三年是个坎,如果过了三年你还没有去研究JVM的话,那么你这个程序员只能是板砖的工具了。下面来个JVM的解析可好?JVM是Java Virtual Machine(Java虚拟机)的缩写,也就是指的JVM虚拟机,属于是一种虚构出来的计算机,在我们实际的电脑上来进行模拟各种计算机的功能的这么个东西。因为有了JVM的存在,搞JAVA的不再需要去关心什么时候去释放内存,也不会像C++程序...

weixin_36416418的博客 117

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

后端开发 java_Java后端开发三年,你不得不了解的JVM

JAVA程序员,三年是个坎,如果过了三年你还没有去研究JVM的话,那么你这个程序员只能是板砖的工具了。下面来个JVM的解析可好?JVM是Java Virtual Machine(Java虚拟机)的缩写,也就是指的JVM虚拟机,属于是一种虚构出来的计算机,在我们实际的电脑上来进行模拟各种计算机的功能的这么个东西。因为有了JVM的存在,搞JAVA的不再需要去关心什么时候去释放内存,也不会像C++程序员...

weixin_39948309的博客 104

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

java后端开发三年,你还不了解JVM,凭什么给你涨薪

一、知识点汇总 JVM是Java运行基础,面试时一定会遇到JVM的有关问题,内容相对集中,但对只是深度要求较高. 其中内存模型,类加载机制,GC是重点方面.性能调优部分更偏向应用,重点突出实践能力.编译器优化和执 行模式部分偏向于理论基础,重点掌握知识点.需了解 内存模型各部分作用,保存哪些数据. 类加载双亲委派加载机制,常用加载器分别加载哪种类型的类. GC分代回收的思想和依据以及不同垃圾回收算法的回收思路和适合场景. 性能调优常有JVM优化参数作用,参数调优的依据,常用的JVM...

m0_67698950的博客 1496

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

java 计数器_Java后端开发三年,你不得不了解的JVM

喜欢的朋友可以关注下专栏:Java进阶之路,里面有大量batj面试题集锦,还有各种技术分享,如有好文章也欢迎投稿哦。JAVA程序员,三年是个坎,如果过了三年你还没有去研究JVM的话,那么你这个程序员只能是板砖的工具了。下面来个JVM的解析可好?JVM是Java Virtual Machine(Java虚拟机)的缩写,也就是指的JVM虚拟机,属于是一种虚构出来的计算机,在我们实际的电脑上来进行模拟各...

weixin_39633976的博客 85
上一篇: VC删除文件夹操作代码
下一篇: 拜托,面试别再问我跳表了!
java1856905
博客等级 码龄8年 100粉丝 249原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值