JVM 相关知识整理

news2025/2/25 23:15:02

文章目录

  • 前言
    • JVM 相关知识整理
      • 1. 新生代和老年代
      • 2. 对象的分配过程
      • 3. Full GC /Major GC 触发条件
      • 4. 逃逸分析
        • 4.1.示例
        • 4.2. 使用逃逸分析,编译器可以对代码做如下优化
      • 5. 对象的内存分配
      • 6. Minor GC 与 Major GC/Full GC的比较:
      • 7. 什么对象进入老年代
        • 7.1. 大对象直接进入老年代
        • 7.2. 长期存活的对象将进入老年代
      • 8. 动态对象年龄判定
      • 9. 空间分配担保
      • 10. 那些情况会触发Full GC
      • 11. 在高性能硬件上部署程序,目前主要有两种方式:

前言

  如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
  而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


JVM 相关知识整理

在这里插入图片描述

1. 新生代和老年代

老年代比新生代生命周期长。
新生代与老年代空间默认比例 1:2:JVM 调参数,XX:NewRatio=2,表示新生代占 1,老年代占 2,新生代占整个堆的 1/3。
HotSpot 中,Eden 空间和另外两个 Survivor 空间缺省所占的比例是:8:1:1。
几乎所有的 Java 对象都是在 Eden 区被 new 出来的,Eden 放不了的大对象,就直接进入老年代了。

2. 对象的分配过程

(1)new 的对象先放在 Eden 区,大小有限制;
(2)如果创建新对象时,Eden 空间填满了,就会触发 Minor GC,将 Eden 不再被其他对象引用的对象进行销毁,再加载新的对象放到 Eden 区,特别注意的是 Survivor 区满了是不会触发 Minor GC 的,而是 Eden 空间填满了,Minor GC 才顺便清理 Survivor 区。;
(3)将 Eden 中剩余的对象移到 Survivor0 区;
(4)再次触发垃圾回收,此时上次 Survivor 下来的,放在 Survivor0 区的,如果没有回收,就会放到 Survivor1 区;
(5)再次经历垃圾回收,又会将幸存者重新放回 Survivor0 区,依次类推;
(6)默认是 15 次的循环,超过 15 次,则会将幸存者区幸存下来的转去老年区 jvm 参数设置次数 : -XX:MaxTenuringThreshold=N 进行设置
(7)频繁在新生区收集,很少在养老区收集,几乎不在永久区/元空间搜集

3. Full GC /Major GC 触发条件

显示调用System.gc(),老年代的空间不够,方法区的空间不够等都会触发 Full GC,同时对新生代和老年代回收,FUll GC 的 STW 的时间最长,应该要避免。
在出现 Major GC 之前,会先触发 Minor GC,如果老年代的空间还是不够就会触发 Major GC,STW 的时间长于 Minor GC。

4. 逃逸分析

随着 JIT 编译期的发展与逃逸分析技术逐渐成熟,栈上分配,标量替换优化技术将会导致一些变化,所有的对象都分配到堆上也渐渐变得不那么"绝对"了。

这是一种可以有效减少 Java 内存堆分配压力的分析算法,通过逃逸分析,Java Hotspot 编译器能够分析出一个新的对象的引用的使用范围从而决定是否要将这个对象分配到堆上,当一个对象在方法中被定义后,它可能被外部方法所引用,如作为调用参数传递到其他地方中,称为方法逃逸,再如赋值给类变量或可以在其他线程中访问的实例变量,称为线程逃逸。
在编译期间,如果 JIT 经过逃逸分析,发现有些对象没有逃逸出方法,那么有可能堆内存分配会被优化成栈内存分配。
jvm 参数设置,-XX:+DoEscapeAnalysis :开启逃逸分析 ,-XX:-DoEscapeAnalysis : 关闭逃逸分析。
从 jdk 1.7 开始已经默认开始逃逸分析。

4.1.示例

在标量替换过程中
标量:表示不可分解的量,如java 的基本数据类型就是标量,反之就是可以分解的量,称为聚合量,而在 JAVA 中对象就是可以被进一步分解的聚合量。
替换过程,通过逃逸分析确定该对象不会被外部访问,并且对象可以被进一步分解时,JVM 不会创建该对象,而会将该对象成员变量分解若干个被这个方法使用的成员变量所代替。这些代替的成员变量在栈帧或寄存器上分配空间。

4.2. 使用逃逸分析,编译器可以对代码做如下优化

(1)同步省略:如果一个对象被发现只能从一个线程被访问到,那么对于这个对象的操作可以不考虑同步。
(2)将堆分配转化为栈分配:如果一个对象在子程序中被分配,要使指向该对象的指针永远不会逃逸,对象可能是栈分配的候选,而不是堆分配。
(3)分离对象或标量替换:有的对象可能不需要作为一个连续的内存结构存在也可以被访问到,那么对象的部分(或全部)可以不存储在内存,而是存储在 CPU 寄存器中。

5. 对象的内存分配

对象的内存分配,就是在堆上分配,对象主要分配在新生代的 Eden 区上,少数情况下可能直接分配在老年代,分配规则不固定,取决于当前使用的垃圾收集器组合以及相关的参数配置。

注:对象优先分布在Eden 区,大多数情况下,对象在新生代 Eden 区中分配。当 Eden 区没有足够空间进行分配时,虚拟机将发起一次 Minor GC。

6. Minor GC 与 Major GC/Full GC的比较:

Minor GC:回收新生代(包括 Eden 和 Survivor 区域),因为 Java 对象大多都具备朝生夕灭的特性,所以 Minor GC 非常频繁,一般回收速度也比较快。

Major GC / Full GC:回收老年代,出现了 Major GC,经常会伴随至少一次的 Minor GC,但这并非绝对。Major GC 的速度一般会比 Minor GC 慢 10 倍 以上

在 JVM 规范中,Major GC 和 Full GC 都没有一个正式的定义,所以有人也简单地认为 Major GC 清理老年代,而 Full GC 清理整个内存堆。

7. 什么对象进入老年代

7.1. 大对象直接进入老年代

大对象是指需要大量连续内存空间的 Java 对象,如很长的字符串或数据。
一个大对象能够存入 Eden 区的概率比较小,发生分配担保的概率比较大,而分配担保需要涉及大量的复制,就会造成效率低下。
虚拟机提供了一个 -XX:PretenureSizeThreshold 参数,令大于这个设置值的对象直接在老年代分配,这样做的目的是避免在 Eden 区及两个 Survivor 区之间发生大量的内存复制。

7.2. 长期存活的对象将进入老年代

VM 给每个对象定义了一个对象年龄计数器。当新生代发生一次 Minor GC 后,存活下来的对象年龄 +1,当年龄超过一定值时,就将超过该值的所有对象转移到老年代中去。
使用 -XXMaxTenuringThreshold 设置新生代的最大年龄,只要超过该参数的新生代对象都会被转移到老年代中去。

8. 动态对象年龄判定

如果当前新生代的 Survivor 中,相同年龄所有对象大小的总和大于 Survivor 空间的一半,年龄 >= 该年龄的对象就可以直接进入老年代,无须等到 MaxTenuringThreshold 中要求的年龄。

9. 空间分配担保

jdk 1.6以后规则如下:
只要老年代的连续空间大于新生代对象总大小或者历次晋升的平均大小,就会进行 Minor GC,否则将进行 Full GC。
通过清除老年代中的废弃数据来扩大老年代空闲空间,以便给新生代作担保。
这个过程就是分配担保。

10. 那些情况会触发Full GC

(1).System.gc() 方法的调用 此方法的调用是建议 JVM 进行 Full GC,注意这只是建议而非一定,但在很多情况下它会触发 Full GC,从而增加 Full GC 的频率。通常情况下我们只需要让虚拟机自己去管理内存即可,我们可以通过 -XX:+ DisableExplicitGC 来禁止调用 System.gc()。
(2)老年代空间不足 老年代空间不足会触发 Full GC 操作,若进行该操作后空间依然不足,则会抛出如下错误:java.lang.OutOfMemoryError: Java heap space
(3)永久代空间不足 JVM 规范中运行时数据区域中的方法区,在 HotSpot 虚拟机中也称为永久代(Permanet Generation),存放一些类信息、常量、静态变量等数据,当系统要加载的类、反射的类和调用的方法较多时,永久代可能会被占满,会触发 Full GC。如果经过 Full GC 仍然回收不了,那么 JVM 会抛出如下错误信息:java.lang.OutOfMemoryError: PermGen space
(4)CMS GC 时出现 promotion failed 和 concurrent mode failure promotion failed,就是上文所说的担保失败,而 concurrent mode failure 是在执行 CMS GC 的过程中同时有对象要放入老年代,而此时老年代空间不足造成的。
(5) 统计得到的 Minor GC 晋升到旧生代的平均大小大于老年代的剩余空间。

11. 在高性能硬件上部署程序,目前主要有两种方式:

(1)通过 64 位 JDK 来使用大内存;
(2)使用若干个 32 位虚拟机建立逻辑集群来利用硬件资源。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1841868.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Tello无人机】使用Matlab完成控制器的设计—建模

模型辨识篇 在实际的无人机系统中,控制器的设计至关重要,它直接影响无人机的稳定性和响应能力。然而,要设计出高效、可靠的控制器,首先必须准确理解无人机的动态行为,这就需要通过收集输入输出数据来辨识其运动学模型。…

LabVIEW与Matlab联合编程的途径及比较

​ LabVIEW和Matlab联合编程可以通过多种途径实现,包括调用Matlab脚本节点、使用LabVIEW MathScript RT模块、利用ActiveX和COM接口,以及通过文件读写实现数据交换。每种方法都有其独特的优势和适用场景。本文将详细比较这些方法,帮助开发者…

【Kubernetes】集群学习

常见的 Kubernetes 集群类型 Kubernetes 集群可以根据不同的标准进行分类,但通常我们根据其部署环境和用途来区分集群类型。以下是几种常见的 Kubernetes 集群类型: 开发集群(Development Cluster): 用于开发和测试环…

RAG优化技巧|7大挑战与解決方式|提高你的LLM能力

在当今快速发展的人工智能领域,大型语言模型(LLM)已经成为无处不在的技术,它们不仅改变了我们与机器交流的方式,还在各行各业中发挥着革命性的影响。 然而,尽管LLM RAG的能力已经让人惊叹,但我…

分享一下,如何搭建个人网站的步骤

在这段充满探索与创造的奇妙旅途中,我就像一位耐心的建筑师,在数字世界的荒原上精心雕琢,两周的时光缓缓流淌。每天,我与代码共舞,手执HTML、CSS与JavaScript这三大构建魔杖,一砖一瓦地筑起了梦想中的网络城…

string类(C++)

文章目录 一.引言二.string类:成员函数:构造函数:析构函数 遍历:operator[]迭代器(iterator)范围for反向遍历(反向迭代器reverse_iterator)const迭代器 容器:capacity扩容clear清数据shrink_to_…

Azure数据分析Power BI

Azure数据分析Power BI 一、Power BI简介二、Power BI 如何匹配角色三、Power BI 构建基块四、使用 Power BI 服务一、Power BI简介 Microsoft Power BI 是一系列的软件服务、应用和连接器,这些软件服务、应用和连接器协同工作,将不相关的数据源转化为合乎逻辑、视觉上逼真的…

Web渗透:XSS-反射型存储型

跨站脚本攻击(Cross-Site Scripting,XSS)是一种常见的网络安全漏洞,它允许攻击者将恶意脚本注入到网页中,其他用户在浏览这些页面时,可能会执行这些恶意脚本,从而导致各种安全问题,如…

关于STM32上用HID HOST调鼠标数据的解析

一、前言 关于这章主要是基于我前面的那篇文章 链接: 关于怎么用Cubemx生成的USBHID设备实现读取一体的鼠标键盘设备(改进版) https://blog.csdn.net/qq_29187987/article/details/139535648?spm1001.2014.3001.5501 引用的文章的简介 引用的这篇文…

【文末附gpt升级秘笈】AI音乐大模型崛起:版权归属与创意产业的新挑战

AI音乐大模型崛起:版权归属与创意产业的新挑战 随着科技的飞速发展,人工智能(AI)已经深入到社会生活的各个领域,音乐领域也不例外。最近一个月,轮番上线的音乐大模型不仅为普通人打开了音乐创作的大门&…

am62x芯片安全类型确认(HS-SE, HS-FS or GP)

文章目录 芯片安全类型设置启动方式获取串口信息下载脚本运行脚本示例sk-am62x板卡参考芯片安全类型 AM62x 芯片有三个安全级别。 • GP:通用版本 • HS-FS:高安全性 - 现场安全型 • HS-SE:高安全性 - 强制安全型 在SD卡启动文件中,可以查看到, 但板上的芯片,到底是那…

手把手教你挖赏金系列(2)如何挖掘短信验证码漏洞

免责声明 由于传播、利用本公众号所发布的而造成的任何直接或者间接的后果及损失,均由使用者本人承担。LK安全公众号及原文章作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢&#…

计算机网络 —— 应用层(DHCP)

计算机网络 —— 应用层(DHCP) 什么是DHCPDHCP工作过程DHCP DISCOVERDHCP OFFERDHCP RQUESTDHCP ACK DHCP租约机制中继代理工作原理功能与优势 我们今天来计网的DHCP: 什么是DHCP DHCP(Dynamic Host Configuration Protocol&…

人工智能这么厉害,比如GPT-4,为什么没有看到程序员大量失业?

从ChatGPT第一版发布到现在,还不到一年的时间中,可是它使用的GPT架构已经从3.5版本进化到现在的4.0版本,随之而来的是其能力的极大提升。下面是GPT-4在其官网的介绍中的一句话: GPT-4是OpenAI最先进的系统,可以产生更安…

FlowUs:打造沉浸式协作体验感受

直观的用户体验 从我个人的角度来看,FlowUs的界面设计非常符合现代审美,简洁而不失功能性。每次打开FlowUs,我都能迅速找到我需要的功能,这大大提升了我的工作效率。 实时协作的流畅性 在FlowUs中,我最喜欢的功能之一就…

记录:[android] SSLHandshakeException: Handshake failed 问题;已解决!

1、问题描述:在使用Retrofit2 时在安卓老设备上(安卓6.0)网络无法请求、安卓 10 、 11 未出现此问题?what? 原因:服务端 TLS 版本过高 2、废话不多说、解决方案A 、添加依赖:implementation org.conscrypt…

[面试题]Kafka

[面试题]Java【基础】[面试题]Java【虚拟机】[面试题]Java【并发】[面试题]Java【集合】[面试题]MySQL[面试题]Maven[面试题]Spring Boot[面试题]Spring Cloud[面试题]Spring MVC[面试题]Spring[面试题]MyBatis[面试题]Nginx[面试题]缓存[面试题]Redis[面试题]消息队列[面试题]…

如何才能入手到好的开放式耳机,总结六招耳机亲测好方法

作为一款当代年轻人基本离不开的数码产品,很有理由进入这次618的必买清单;但是如果不是耳机领域或者是数码领域的,对于耳机的参数、数据和使用等都不了解,就很容易造成踩雷,不仅浪费钱,还浪费时间&#xff…

国际版游戏陪练源码电竞系统源码支持Android+IOS+H5

🎮电竞之路的得力助手 一、引言:电竞新纪元,陪练小程序助力成长 在电竞热潮席卷全球的今天,每一个电竞爱好者都渴望在竞技场上脱颖而出。然而,独自一人的游戏之路往往充满了挑战和困难。幸运的是,国际版游…

14:补充-变量作用域-页面加载

试问:在控制台打印person1、person2结果是什么? var person2{name:"张三",age:21}//页面加载完成执行的事件window.onloadfunction(){var person1{name:"李四",age:18}} 打印结果:在控制台中发现person1这个变量不存在 原…