JVM学习

为什么要学习JVM? 1、最初是为了面试 跟许多人一样,我一开始接触 Java 虚拟机只是因为面试需要用到,所以硬着头皮看看。所以很多人对于为什么要学虚拟机这个问题,他们的答案都是:因为面试。但我经过了几年的学习和实战,我发现其实学习虚拟机并不仅仅在于面试,而在于更深入地理解 Java 这门语言,以及为未来排查线上问题打下基础。 2、深入理解Java 对于刚刚工作一两年的朋友来说,各个 API 都没用熟,自然不会去深入研究 Java 中的各种细节。但对于工作了三年以后的朋友来说,很多时候你要解决一个问题必须深入到字节码层次去分析 阅读详情

参考这个博客:
https://mp.weixin.qq.com/s/4c9K5eYMFGVV2WyKaYXVBA

参考书籍:深入理解Java虚拟机

JVM就是java虚拟机的意思,java之所以可以跨平台,就是因为其语言运行在虚拟机上,从而达到跨平台的效果
目前常用的虚拟机有两个,一个是sun公司的hotspot,另一个是 JRockit

java的内存管理,其内存分为三大部分,栈,堆,方法区(又叫块,永久代Permanent Generation)
上面只是一个笼统的划分,细分如下:
1.方法区(Method Area)
2.堆(heap)
3.栈(stack)
3.1虚拟机栈,就是常说的对象变量存放的地方
3.2本地方法栈,为JVM中native方法服务
3.3程序计数器,就是程序运行时,运行到哪一步的一个记录器。多线程中程序切换,就是由各自线程的程序计算器来记录当前线程运行的状况,以便切换后能继续执行下去。

如下图:
这里写图片描述

栈:
栈是线程独有的,堆和块是线程共享的,所以栈的生命周期与线程相关,一般不用回收,只有堆和区需要

栈是存放对象的引用的,比如,Object j=new Object(); 那么这个j就是存放在栈中,还有局部变量等。
一般如果出现栈溢出(StackOverFlow),那么都是方法死循环造成的。

堆:
堆是存放对象的空间,上面这个j对应的内存空间就是在堆中,这部分才是我们可以控制的,也是gc(垃圾回收)需要注意的数组也是在堆上分配

堆如果细分,有新生代(年轻代),老年代(年老代),再细分,年轻代内存又被分成三部分,Eden空间(伊甸园)、From Survivor空间(S0)、To Survivor空间(S1),默认情况下年轻代按照8:1:1的比例来分配

方法区
方法区,是存放类信息,类的常量,静态变量,接口,方法等。
也可以称为永久代(Permant Gernation),一般不轻易回收,但也会,不是真的永久。。。
这里写图片描述

当对象没有被引用时,即j=null时,而且没有其它对象引用j,才会回收堆上的空间

JVM设置的值
-Xmx ——最大堆大小
-Xms ——初始堆大小
一般Xmx与Xms设置大小相同,不然当内存达到Xms时,未到Xmx,需要再分配内存时,会触发fullGc。而如果一开始就分了Xmx内存大小,则没有这个问题。但是会在内存不足时,直接报错(当机),没有再分配的机会。

-XX:PermSize ——方法区最小值
-XX:MaxPermSize——方法区最大值
-Xss——栈的大小, 每个线程可使用的内存大小
-Xmn——新生代大小,老生代=Xmx-Xmn,Xmn不能等于Xmx,否则会报错
-XX:NewSize——新生代初始大小
-XX:MaxNewSize——新生代最大值
一般用-Xmn代替上面两个设置。
-XX:NewRatio=m 老年代与 新生代比例 如果是5,则是5:1的意思

-XX:SurvivorRatio=m Eden和Survivor的比例
SurvivorRatio为新生代空间中的Eden区和救助空间Survivor区的大小比值,默认是32,也就是说Eden区是 Survivor区的32倍大小,要注意Survivo是有两个区的,因此Surivivor其实占整个young genertation的1/34

在设置内存时,可以用m,g等,但是不能m和g混着用,否则可能报错

32位系统,一般一个进程(java服务)分配的内存大小事有限的,比如linux给这个进程分配了2g内存,那么最大堆内存+最大方法区内存+栈内存不能大于这个2g,故一般设置时,Xmx,MaxPermSize最好不要大于服务器内存,否则会有可能服务无法启动
计数器很小一般忽略不计,栈内存一般默认1m,你可以调整。因为栈跟线程相关,故栈内存越小,能创建的线程就越多,那么线程数也不是无限的,操作系统一般有规定不能大于多少。

对象分配规则

对象被创建时,内存的分配首先发生在年轻代的Eden区(大对象可以直接在年老代),大部分对象在创建后很快就不再使用,很快就被年轻代的GC回收。
新生代分为伊甸园区(Eden),存活区1(S0),存活区2(S1),当伊甸园区满了之后,会执行一次垃圾回收(Minor GC),把剩余的放到两个存活区中。每经过1次Minor GC,对象的年龄计数器+1,到达阀值后,进入老年代。

对象如果在新生代存货了下来(几次GC后没被回收掉),则会被复制到老年代。年老代的空间比年轻代大,存放更多对象,发生GC的次数也少,当年老代内存不足,将执行full gc(整个内存区域垃圾回收)

垃圾回收

minorGc——一般在新生代,时间较短
MajorGC——一般在老年代,也可能因为minorGc后空间不足触发
fullGc——整个堆回收,时间较长,会导致整个应用停顿。比如你Xms=100m Xmx=1024,那么再内存不足时,由于没到最大值,会自动再给他分配内存,此时就会触发fullGc。或者你对象很大,老年代放不下,也会触发fullGc。如果到达1024,还要分配内存,就会出发内存错误。

对象存活判断:

1.引用计数
原理:对象有一个引用,则+1,删除一个引用,则-1,只收集计数为0的对象
缺点:无法处理循环引用的问题,如对象A和对象B互相引用,A.b=B,B.a=A,除此之外,没有其他对象引用A,B,那么无法回收他们
JVM并未使用此算法

2.可达性分析
GC Roots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,不可达对象。

回收算法
复制(Copy)
原理:把内存空间划分为两个相等的区域,每次只使用一个区域。垃圾回收时,遍历当前区域,把存活的对象复制到另外一个区域, 再把已使用过的内存空间一次清理掉。
优点:不会出现碎片问题,高效,遍历一次即可。
缺点:需要两倍大的内存
应用场景:堆的新生代回收中使用。经过一次垃圾回收后的对象复制到Survior中
如图所示,可以看到,每次内存都只用了一半,很浪费。
这里写图片描述

标记 -清除算法(Mark-Sweep)
首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象
缺点:会导致内存零碎,那么如果有大对象,将会出现没有连续的内存去存放这个大对象。需要两次遍历,第一标记,第二次清除。
如图所示,可看到回收后碎片较多。
这里写图片描述

标记—压缩
从GC roots开始遍历所有引用,对有活的对象进行标记。让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存
优点:避免复制算法的空间问题,避免标记-清除的碎片问题
堆的老生代回收中使用该算法,因为要遍历,故比复制算法要慢
如图所示:

这里写图片描述

分代收集,Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记-清理”或“标记-整理”算法来进行回收。

垃圾回收器
即使用回收算法的各种回收器,过于复杂,不讨论。有以下几种

Serial收集器,串行收集器是最古老,最稳定以及效率高的收集器,可能会产生较长的停顿,只使用一个线程去回收。
ParNew收集器,ParNew收集器其实就是Serial收集器的多线程版本。
Parallel收集器,Parallel Scavenge收集器类似ParNew收集器,Parallel收集器更关注系统的吞吐量。
Parallel Old 收集器,Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法
CMS收集器,CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。
G1收集器,G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征

一般老年代比新生代大,这样可以在新生代触发minorgc,时间较短(影响较小),老年代空间大,就不用老是gc了。
如果gc时间较短,几百毫秒,基本不需要怎么调整,如果1秒以上,才需要关注。

基于Cohesive单元的二维水力压裂(二) 部件 2D-deformabel-shell 尺寸100 矩形工具(-20,-20)(20,20) 刨分:预知cohesive单元&定位注液点位置,定义全局网格尺寸0.2 X方向采用过渡网格,向中间加密。指定网格类型:CPE4P,指定单元类型,COH2D4P,粘性正则化系数:0.0001 材料属性 材料1 弹性模量10e9,泊松比0.25,渗透率1e-7,孔隙比0.1,液体比重... 阅读详情

相关推荐

Abaqus复合材料层合板仿真

由于复合材料的损伤失效问题过于复杂,解析方法受到数学工具的限制难以实现,而实验也需要高昂的费用和时间成本难以广泛应用,Abaqus针对复合材料提供了专业的建模工具和损伤分析理论来模拟复合材料层合板在各种工况下的失效行为。

JXHXHL的博客 2541

JVM入门学习

一、JVM的位置 程序通过java XX.class运行,这个命令是JRE的命令,JRE中包括JVM,而JRE是建立在操作系统上使用的,操作系统又是基于硬件为基础的。 二、jvm的体系结构 详细体系结构: 三、类加载器 这里的Car.class是.class文件,经过类加载器进行加载和初始化变成Class类,再通过实例化变为对象。 Class Loader的三个阶段(类加载的三个阶段) 1.加载阶段 将编译好的class文件加载到内存中(方法区),然后会生成一个代表这个类的Class对象。

Cguoer的博客 3275

若依(RuoYi)框架从零到部署:Spring Boot+Vue权限系统完整配置指南

在Java企业级应用开发中,Spring Boot作为构建微服务和单体应用的基石,极大地简化了项目初始化和配置流程。其核心原理在于通过自动配置和起步依赖,快速整合数据访问、安全认证、缓存等常用模块,显著提升开发效率。这一技术价值在需要快速构建后台管理系统的场景中尤为突出,例如权限管理、用户角色分配等通用需求。若依(RuoYi)框架正是基于Spring Boot和Vue.js的优秀实践,它封装了RBAC权限模型、代码生成器等高频功能,提供了开箱即用的解决方案。本文聚焦于若依框架的【环境配置】与【项目部署】,通

weixin_33984032的博客 455

JVM详细学习

会移动到老年代。老年代是存储长期存活的对象的,占满时就会触发我们最常听说的Full GC,期间会停止所有线程等待GC的完成。所以对于响应要求高的应用应该尽量去减少发生Full GC从而避免响应超时的问题。而且当老年区执行了full gc之后仍然无法进行对象保存的操作,就会产生OOM,这时候就是虚拟机中的堆内存不足,原因可能会是堆内存设置的大小过小,这个可以通过参数-Xms、-Xmx来调整。也可能是代码中创建的对象大且多,而且它们一直在被引用从而长时间垃圾收集无法收集它们。

qq_52574792的博客 1088

yolo自动化项目实例解析(九) 导航

比如我们经常使用的导航,说白了就是寻找两点之间最近的路径,也就是所谓的寻路,我们需要想办法让程序知道他要去哪里,路径包含(起点、轨迹、路径)

默子昂 1998

无刷电机控制基础(2)——有感和无感驱动、调速

上一篇文章我们讲了一些无刷电机的基础知识,包括无刷电机的内部结构,驱动原理等,我们知道了只需要按照转子的当前位置,来按顺序给定子线圈通电,就能让电机转动起来。但是,上一篇中我们跳过了一个关键步骤,就是如何检测转子的位置。本篇我们就讲讲常用的位置检测方法,以及引出的一些相关问题。我们知道,获取磁铁的位置可以用霍尔传感器,无刷电机的转子就是永磁体,因此只要在合适的位置安装霍尔传感器,就能知道转子的旋转位置。在无刷电机中,一般用3个开关型霍尔器件就能检测转子的位置。

小白白学电子 2万+

如何才能学好JVM?——零基础入门篇

JVM的学习是一个长期而有趣的过程,希望你能保持好奇心和实践精神,不断探索,不断学习。

BASK2311的博客 1501

如何在R中高效安装ropls及其依赖包

本文详细介绍了在R语言中高效安装ropls包及其依赖的完整流程。作为Bioconductor生物信息学分析包,ropls的安装需通过BiocManager管理器进行。文章提供了标准安装步骤、跨系统避坑指南及安装后验证方法,帮助用户解决R版本、编译环境和网络镜像等常见问题,确保代谢组学数据分析工具顺利部署。

efc123456的博客 908

JVM学习总结

JVM是什么 JVM就是java虚拟机,它是一个虚构出来的计算机,可在实际的计算机上模拟各种计算机的功能。JVM有自己完善的硬件结构,例如处理器、堆栈和寄存器等,还具有相应的指令系统。 Java字节码是执行在JRE((Java Runtime Environment Java运行时环境)上的。JRE中最重要的部分是Java虚拟机(JVM),JVM负责分析和执行Java字节码。 JVM是java字节...

西京刀客 1181

PCL RANSAC拟合空间圆【2026最新版】

RANSAC三维点云空间3D圆拟合。博客长期更新,本文最新更新时间为:2026年4月13日。代码在PCL1.15.0中测试通过

点云侠的博客 7455

XCP详解「3.1·ASAP2新建A2L文件」

后面是ASAP2新建A2L的操作步骤,如果是APE中新建的A2L就无需以下操作,APE只需要导入现成的A2L即可。退出点击保存时会提示保存A2L文件,是因为前面导出的是1.70版本,工程最低1.71,可以另外起个名字即可。导入elf文件,elf路径建议直接索引编译生成的Debug下的,防止编译后忘记更新。导出V1.70格式A2L文件,APE17支持V1.70。通过ASAP2生成需要A2L文件更常用些。同一个信号可以创建不同属性量。ASAP2中新建A2L文件。设置标定信号数量最大值。XCP详解「总目录」

光明磊学习&积累的地方 3061

jvm的学习

一、jvm的位置 JVM是运行在操作系统之上的,它与硬件没有直接的交互 二、jvmt体系结构 ①程序计数器 (1)程序计数器是一块较小的内存空间,是当前线程所执行的字节码的行号指示器,字节码解释器工作时是通过改变这个计数器的值来选取下一条需要执行的字节码(包括分支、循环、跳转、异常处理、线程恢复) (2)java虚拟机多线程是通过线程轮流切换分配处理器执行时间,为了多线程切换后能...

程序猿的十万个为什么 1840

LeRobot 官方论文:一个用于端到端机器人学习的开源库

本文介绍了一个名为LeRobot的开源库,旨在解决机器人学习领域的碎片化问题。该库提供了端到端的技术栈,包括统一的机器人中间件API、标准化的数据集格式(LeRobotDataset)、优化的推理栈以及多种最先进机器人学习算法的实现。LeRobot支持多种低成本开源机器人平台(如SO-10X、ALOHA-2等),通过共享中间件实现便捷的遥操作和数据收集。其数据集格式已广泛应用于社区,截至2025年9月已有16,000多个数据集公开共享。该库还支持流式处理大规模数据,降低了研究门槛。在模型方面,LeRobot

2506_90492529的博客 907

JVM的定义以及JVM的学习路线

1. 什么是JVM 定义: Java Virtual Machine - java程序的运行环境(java二进制字节码的运行环境)。 好处: JVM是java程序一次编写,到处运行的基石。 JVM屏蔽了java字节码与底层操作系统的差异,对外提供了一个一致的运行环境,JVM用解释的方法来执行二进制字节码,来达到代码的平台无关性。 自动内存管理,垃圾回收功能。 java语言它的出现时期比较早,这个优点是相较于C、C++来说的,C、C++程序在编写的时候程序员要手动释放内存,如果操作不当很容易会造成内存泄漏

qq_50313418的博客 1425

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【JVM系统学习之路系列】 JVM 概述篇

JVM系统学习之路系列演示代码地址: https://github.com/mtcarpenter/JavaTutorial 前言 大家好,我是小春哥,前面我用了10多个章节对并发编程 JUC 相关知识进行梳理,如果对 JUC知识还不了解的同学,关注我的公众号【山间木匠】从菜单底部可直达,从本篇文章开始更新 JVM 相关知识点,每一个JAVA 开发者应该都能深刻体会,多线程、并发、JVM 是难点也是痛点。 国内学习 JVM 虚拟机的人几乎是人手一本,周志明大神的“深入理解Java虚拟机”书籍。我第一次看.

havendream的博客 1175

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【jvm第0集】jvm学习路线指南

分享jvm学习路线指南,每个模块深入学习都要花费很多时间,但这个是每个java程序员的必修之路,可以不精,但必须懂。大家可以跟着我的文章学习,不是很精,但够用。因为等你需要解决jvm相关问题的时候,你已经知道怎么去解决了。学习之路,长路漫漫,唯有坚持。

学不可以已,活到老,学到老。 927

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

1. 如何学习JVM

Table of Contents 声明 JVM与学习其他框架的区别 学习方式 国内权威人士 声明 本系列为北京圣思园深入理解JVM读书笔记 JVM与学习其他框架的区别 1. 其他框架大多是应用层技术框架,学习完后马上可以照猫画虎来应用,立竿见影 2. JVM很枯燥,很多理论 3. 应用崩溃时生成的dump文件需要仔细分析 4. 容易遗忘 5.并不能马上应用,很难用...

Kevin的博客 585

JVM 学习前置知识

JVM 学习前置知识

m0_63949203的博客 1390

jvm学习

java源代码->二进制字节码->解释器->机器码->CPU记住下一条JVM指令的执行地址(解释器中)每个线程运行需要的内存空间栈帧:一个栈由多个栈帧组成每个方法运行时需要的内存参数局部变量返回地址每个线程只能有一个活动的栈帧,对应正在执行的方法方法执行完成,栈帧出战,对应方法的执行完成通过new关键字,创建对象都会使用堆内存不属于JVM内存,是操作系统内存类加载阶段可分为:加载->连接->初始化加载:将字节码.class文件通过类加载器加入到方法区。

Dearfrienda的博客 1587

学习JVM有什么用

我第一次意识到要学习JVM是在三年前的一场面试中,那时我正在面中级开发工程师。那是一家在深圳北站附近的公司

毛惜时的博客 539

[Java]JVM学习笔记

JVM学习笔记 在极客时间学习课程时,李智慧老师分享了关于新技术学习方法的经验,叫做“5-20-2”法。 解释一下,就是在学习一项新技术时: 要在5分钟之内了解他是解决了什么问题,相比竞品技术有什么优势; 在20分钟之内,了解这项技术在解决这些问题的时候用了哪些思路,哪些新颖方法; 在2个小时之内,试着做一些demo快速上手。 如果能做到这些,就对这项技术进行一个持续的深挖,如果解决不了这些问题,就及早收手,免得过多浪费时间。 为了试验上述方法的可行性,以JVM为切入点,我开始有意识的训练自己在短时

optimus 358

JVM虚拟机学习目录页

使用Java已经多年,但是对JVM底层还是一直没有系统学习过,现在开始爬这座高山,以此博客记录。 学习源码:https://gitee.com/Coline/JVM JVM虚拟机学习(1)---Jvm内存区域:https://blog.youkuaiyun.com/u011294519/article/details/95937162 JVM虚拟机学习(2)---JVM对...

左撇子帕布 344

JVM学习资源

【官方文档】oracle JVM 规范说明书https://docs.oracle.com/javase/specs/jvms/se8/html/ 包含:JVM 的介绍;结构;编译;class 文件的结构;加载、链接、初始化;JVM 指令集;JVM 指令操作码对照表。 链接是 JDK 1.8 的版本,如需看其他版本修改 url 中的 se 后的数字即可。 【书籍】《Java虚拟机规范(Java SE 8版)》豆瓣 上面 JVM 规范说明书的中文解读,如果不习惯看官方英文文档,可以看下本书。阐释了 JVM

ConstXiong 377

JVM 全面深入学习路径

JVM深入学习路径摘要 本学习路径系统化覆盖JVM核心技术,分为五大部分: 基础架构:详解JVM内存模型、类加载机制和执行引擎 内存管理:深入垃圾回收算法、收集器实现和调优实战 字节码技术:解析类文件结构、指令集和动态代理原理 性能调优:掌握监控工具使用、参数配置和锁优化策略 高级主题:探讨JIT编译、逃逸分析及ZGC等前沿技术 学习路线从底层原理延伸到生产实践,包含丰富案例分析,适合希望深入理解Java虚拟机核心机制的中高级开发者。

weixin_39956506的博客 767

JVM学习思路

2016大学毕业之后差不多从事JAVA后台相关开发工作也差不多三年,但是在工作中很少能接触到JVM的相关知识,每天几乎就是重复的CRUD--对于技术的提升毫无用处; 对于JVM的概念或多或少听过很多,之前跳槽的时候为了应付面试也是自己看了一点博客、书本、视频等,但是对于JVM的认知几乎仅仅停留在背诵概念的阶级上,对于真正的原理几乎还是零的认知;工作了三年也到了一个程序的初级瓶颈期了...

weixin_42964580的博客 384
上一篇: Spring事务管理
luo19890923
博客等级 码龄16年 1粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值