java开发?你就得去了解JVM!

java开发工作三年你应该掌握的知识(持续更新) 1、java中常用的类有哪些? Scanner、system、String、Integer、Arrays、Boolean、Math、Double、Character、Calendar、Random、BigIngteger、arraylist、hashMap、Thread、Date、Iterator 2、java中常用的包有哪些? Lang、IO、sql、util、awt、net、 3、Object... 阅读详情

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),下面就是书中的图:

image.png

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

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

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

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

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

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

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

image.png

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

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会有相应转变)

image.png

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

**Minor GC:**GC新生代,

**Full GC:**老年代GC,

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

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

Minor GC:

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

image.png

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

image.png

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

image.png

然后把Enden区清空回收掉

image.png

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

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

先是这个样子的

image.png

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

image.png

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

image.png

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

image.png

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

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

image.png

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

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

-XX:MaxTenuringThreshold

就类似这样子

image.png

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

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

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

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

为什么Java开发者必须了解JVM架构与性能优化:让应用飞起来! 作为一名Java开发者,你一定在开发过程中遇到过性能问题:应用变慢、内存泄漏、GC停顿影响用户体验……这些问题往往源自于你对JVM(Java Virtual Machine)内在机制的不够了解。我们通常把焦点放在代码本身,却往往忽视了“幕后英雄”——JVM的优化。而实际上,JVM的优化,不仅能提升你的应用性能,还能让你在团队中脱颖而出。那么,JVM到底是如何运行Java程序的?如何利用它进行性能优化? 阅读详情

相关推荐

深入了解JVM

之前看了一本书《深入理解Java虚拟机》,里面将的主要就是关于Java虚拟机的发展史,Java虚拟机的主要功能介绍,还有其他的关于Java虚拟机底层的东西。 对于Java开发者来说,现在最新的JDK版本应该是JDK12,我们都知道在Java语言是夸平台的,这里的夸平台并不是指Java这个编程语言的夸平台,而是指JVM的夸平台特性。我们在不同的环境上可以使用不同的虚拟机来实现不同的平台上运行Ja...

初学者 2802

三年JAVA最全最精华面试题

JAVA基础 1. Hashcode()和 equals()和==区别? (1) hashcode()方法跟 equals()在 java 中都是判断两个对象是否相等 (2) 两个对象相同,则 hashcode 至一定要相同,即对象相同---->成员变量相同 ---->hashcode 值一定相同 (3)两个对象的 hashcode 值相同,对象不一定相等。总结:equals 相等则 hashcode 一定相等,hashcode 相等,equals 不一定相等。 (4)==比较的是两个引用在内存

架构师干货 2476

Java开发不可或缺!深入了解Java虚拟机(JVM 后端)

Java虚拟机是Java平台的关键组件之一,它充当了Java程序和底层操作系统之间的中间层。它负责将Java源代码编译成可执行的字节码,并提供了一种跨平台的执行环境。Java开发人员可以在任何支持JVM的操作系统上运行他们的程序,而不需要关心底层操作系统的差异。字节码执行:Java源代码在编译时被转换为字节码,这是一种与平台无关的中间代码。JVM负责解释和执行字节码指令。垃圾回收:JVM内置了垃圾回收机制,它能自动管理内存分配和释放。开发人员不需要手动管理内存,这大大简化了Java程序的开发和维护。

OyLinux的博客 141

java开发三年,总结一些经历与经验。_java开发工作经历

正常的开发肯定是没有问题的,一些简单的技术问题还是能解决的,但是对于技术的深度,技术的学习,没有很强烈的兴趣,没有追求技术的心,那么意味着在干几年依然还是开发,没有什么前途。第二就是设计了,作为开发,做了两年其实基本没见过啥是设计,基本都是直接拿着需求就开发了,框架的结构是项目定好的,功能的设计基本都是自己搞的,作为科班出身,一直认为设计很重要,并且对于自己的思维有一定的信心。第二个项目,是政府的项目,用的应该是SSH的,很正常的管理系统,包括正常的OA以及一系列的系统。总结下当前个人遇到的问题。

2401_85013639的博客 1390

个人整理的3年以上JAVA开发面试资料

根据自己的工作经验,近期准备跳槽,查阅了各个微博网站及学习网站,整理了一套相对主流的面试问题资料

邮件伪造和SPF

之前看了下邮件伪造觉得挺有意思的,所以看了下邮件伪造的东西,下面简单的总结了一下,如果有不妥的地方还望大佬们提出来。 1. 什么是SPF SPF是 Sender Policy Framework 的缩写,一种以IP地址认证电子邮件发件人身份的技术,是为了防范垃圾邮件而提出来的一种DNS记录类型,它是一种TXT类型的记录。 接收邮件方会首先检查域名的SPF记录,来确定发件人的IP地址是否被包含在SP...

SunJ3t的菠萝屋 2449

java开发1年经验、2年经验、3年经验区别是什么

java开发1年经验、2年经验、3年经验区别是什么

大连赵哥的博客 1525

CTFmisc-------Jack

每一个文件里面都有不一样的base64编码,我尝试将其解密,发现解出来的是乱码,所以我想到真正的flag藏在这些字符串中,所以我们要写代码把字符串提取出来。提取出来后,得到很多的base64的编码,要一个一个的解码很麻烦,猜到里面有flag字样的base64编码,所以我们将flag进行base64编码,1.下载得到Jack文件夹,里面有很多的txt文件。发现这个字符串是众多编码中唯一一个没有==然后从那些base编码中寻找Zmxh字段。

woshicainiao666的博客 1万+

java3年经验要求是什么

java3年经验要求是什么

大连赵哥的博客 843

Cadence Sigrity PowerSI实战:从.brd到S参数提取的完整避坑指南

本文详细介绍了使用Cadence Sigrity PowerSI进行信号完整性分析的完整流程,从.brd文件预处理到S参数提取的关键技巧。通过实战案例和避坑指南,帮助工程师高效解决高速PCB设计中的信号质量问题,提升仿真精度和设计效率。

carrot的博客 696

Phantom Omni的力与力矩操作

*本说明为对Phantom Omni的力与力矩操作 ****************虚拟夹具的力读取与控制************************ 1、首先力的读取要声明【全局变量】 hduVector3Dd F;//三维矢量力(x,y,z三个方向的力) 2、对力的控制可以采用配置函数Set()与Get()函数; 3、对力觉的控制或读取操作需要放到【回调帧】开始与结束之间,如例子

xuliang355的博客 2563

一步到位!彻底了解Java中JDK、JRE、JVM分别是什么及它们之间的联系

首先,next()一定要读取到有效字符后才可以结束输入,对输入有效字符之前遇到的空格键、Tab键或Enter键等结束符,next()方法会自动将其去掉,只有在输入有效字符之后,next()方法才将其后输入的空格键、Tab键或Enter键等视为分隔符或结束符。简单地说,next()查找并返回来自此扫描器的下一个完整标记。完整标记的前后是与分隔模式匹配的输入信息,所以next方法不能得到带空格的字符串...

weixin_45797022的博客 3940

BLE天线设计避坑:NRF52832官方50欧姆阻抗匹配的3个常见误区

本文深入解析NRF52832蓝牙SoC天线设计中的常见误区,重点探讨50欧姆阻抗匹配的3个关键问题:PCB板材介电常数差异、匹配元件寄生参数及VSWR测试。通过实测数据和优化方案,帮助工程师规避设计陷阱,提升BLE通信性能。

beer8的博客 216

作为一名java开发人员,不了解jvm调优对工作有什么影响?

对于java开发者来说,不论是新手还是老手,都会听说jvm一词,jvm算是java里比较核心与关键的东西了,但是对于一些新手或者工作有一段时间的java程序员来说,貌似感觉jvm并不那么重要一样,自己平时写代码写得好好的,不是很了解jvm好像也没什么的,其实这就大错特错了,jvm是时时刻刻的起着重要的作用,你写的代码都是基于他上面运行的,那么有的人就可能说不需要了解jvm照样能写好代码,有这种可能...

sssdhua的博客 3233

【推荐100个unity插件】Animator 的替代品?—— Animancer Pro插件的使用介绍

Animancer与Unity Animator对比及使用指南 摘要: 本文对比了Animancer与Unity官方Animator的核心差异,分析了Animancer的优势特点。Animancer采用代码驱动模式,相比Animator的状态机系统更灵活高效,支持实时调试、动态混合和深度逻辑集成。文章详细介绍了Animancer的快速使用方法,包括动画播放、切换和触发机制,并区分了免费版与专业版的功能差异。适合需要高效动画开发、复杂交互逻辑的中小项目,为开发者提供了一种现代化的动画解决方案。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2435

SIMULINK开发项目实例 1000 例专栏之第960例--基于电力系统稳定性的建模与仿真场景:-含分布式电源的配电网电压稳定性研究

间歇性与随机性:例如,太阳能依赖于日照强度,风能依赖于风速,这使得它们的输出功率具有不确定性。逆变器接口:大多数分布式电源通过逆变器接入电网,这对电网的动态响应特性产生了影响。位置分散:通常分布在用户侧或靠近负荷中心的位置。本文详细介绍了如何使用Simulink结合Simscape Electrical 构建一个用于研究含分布式电源配电网电压稳定性的模型,并提供了详细的仿真流程说明。

xiaoheshang_123的博客 156

java 开发 jvm_Java开发人员应了解的JVM流行语

java 开发 jvm 本文将与您分享一些JVM“流行语”,它们对于Java开发人员在执行任何JVM性能和垃圾回收调优之前理解和记住非常重要。 本文末尾还提供了一些技巧,包括一些高级性能调优最佳实践。 将来的文章中将探讨有关Oracle HotSpot并发GC收集器(例如CMS和G1)的更多建议。 在继续阅读之前,建议您首先熟悉JVM详细的GC日志。 掌握此JVM数据分析技能至关重要,尤其...

最佳 Java 编程 149

【四足机器人项目实战】四足机器人支撑腿反作用力规划之VMC解耦控制方法

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、基于模型的工作空间控制框图二、原理三、缺点 前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对未简化的动力学模型规划反作用力+运动学模型雅可比+虚功原理规划关节扭矩方法做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章 提示:以下是本篇文章正文内容 一、基于模型的工作空间控制框图 . . 二、原理 基于机器人的动力学模

qq_35635374的博客 6599

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

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

java1856905的博客 727

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java开发必须要掌握的20个核心技术,你掌握多少?JVM是重点!

点关注,不迷路;持续更新Java相关技术及资讯!!! 对于刚刚接触Java的人来说,JVM相关的知识不一定需要理解很深,对此里面的概念有一些简单的了解即可。 不过对于一个有着3年以上Java经验的资深开发者来说,不会JVM几乎是不可接受的。 JVM作为java运行的基础,很难相信对于JVM一点都不了解的人可以把java语言吃得很透。 面试有超过3年Java经验的开发者的时候, JVM几乎就是一个...

XingXing_Java的博客 1017

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

是时候深入了解JVM了

刚开始接触Java时,对JVM是无知的,确实,是无感知的。因为Java的设计者,为了降低语言的复杂度,屏蔽实现细节,将很多背后的操作"隐藏"了。 在很长时间里,不需要了解Java虚拟机,也能写出可以运行的代码,甚至完美地运行一个Java程序。什么垃圾回收机制,类加载机制统统都抛之脑后,好像也没人说你不懂Java。 直到…一次OOM的出现。 解决Bug的能力与手段,决定了你想成为程序员还是好程序员。...

随-记的专栏 1057

关于JVM 你该了解的一切

类加载过程和Java (JVM)内存模型以及调优

极客星云-优快云博客 945

JVM:Java开发者必须了解的核心技术!

缩写全称本质作用JDK开发者工具包提供编译、调试、运行 Java 程序所需的全部命令和库。JRE运行时环境提供运行已编译 Java 程序所需的虚拟机、类库和支持文件。JVM虚拟机规范+具体实现负责加载字节码、验证、解释/编译、执行,并管理内存、线程、GC 等。将字节码文件转成具体系统平台的机器指令。JVM + Java语言的核心类库。JRE + Java的开发工具。

2403_87102691的博客 445

Java开发人员应了解的JVM流行语

本文将与您分享一些JVM“流行语”,它们对于Java开发人员在执行任何JVM性能和垃圾回收调优之前理解和记住非常重要。 本文末尾还提供了一些技巧,包括一些高级性能调优最佳实践。 将来的文章中将探讨有关Oracle HotSpot并发GC收集器(例如CMS和G1)的更多建议。 在继续阅读之前,建议您首先熟悉JVM详细的GC日志。 掌握此JVM数据分析技能至关重要,尤其是与更高级的APM技术...

最佳 Java 编程 169
上一篇: Tomcat与JVM性能调优(详细)
下一篇: java多线程超详细到极致的内容!
Java_Yhua
博客等级 码龄6年 51粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值