JVM相关

文章目录

  • JVM的类加载过程
  • JAVA内存泄露
    • 内存泄露的常见原因
    • 内存泄露的影响
    • 问题排查
  • JVM的调优
  • java四种引用类型

JVM的类加载过程

JVM的类加载过程包括加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)五个阶段,具体如下:

  1. 加载(Loading):加载是类加载过程的第一个阶段,它的主要任务是通过类加载器将类的字节码文件加载到内存中,并生成一个代表该类的 java.lang.Class 对象。类加载器会根据类的全限定名来定位并读取类文件,然后将类的字节码数据转换为方法区的运行时数据结构。

  2. 验证(Verification):在验证阶段,虚拟机将对加载的类进行各种验证,以确保类文件的字节流符合虚拟机的规范要求,防止恶意代码或错误的字节码文件影响虚拟机的正常运行。

  3. 准备(Preparation):在准备阶段,虚拟机为类的静态变量分配内存,并设置默认初始值,这些变量存储在方法区中。注意,此时不会为实例变量分配内存,实例变量会在对象实例化时随着对象一起分配在堆内存中。

  4. 解析(Resolution):解析阶段是将常量池中的符号引用替换为直接引用的过程。解析阶段可能在初始化之前或初始化过程中进行。

  5. 初始化(Initialization):初始化阶段是类加载过程的最后一个阶段,此阶段是真正执行类中定义的Java程序代码(静态变量赋值、静态代码块等)的阶段。当一个类被初始化时,其父类也会被初始化,但接口并不会被初始化。类初始化阶段是线程安全的,多个线程同时初始化一个类时,只会有一个线程执行初始化,其他线程会被阻塞。

总的来说,类加载过程是JVM将类加载到内存并准备好供程序运行所需的各种数据结构的过程,它确保了Java程序的正确性和安全性。

JAVA内存泄露

内存泄露的常见原因

  • 资源未释放
    程序中使用的资源(比如文件、数据库连接、网络连接等)未被正确释放或关闭,这些资源所占用的内存将无法被垃圾回收机制释放。如果程序中频繁创建资源却不释放或者忘记释放资源,将会导致内存泄漏问题。
  • 内部类持有外部类
    如果有地方引用了这个非静态内部类,会导致外部类也被引用,即使外部类已经没有其他地方在使用了,垃圾回收时也无法回收这个外部类
  • ThreadLocal的内存泄露
    ThreadLocal内存泄漏的根源是:由于ThreadLocalMap的生命周期跟Thread一样长,如果没有手动删除对应key就会导致内存泄漏,而不是因为弱引用。
    ThreadLocal正确的使用方法
    每次使用完ThreadLocal都调用它的remove()方法清除数据
    将ThreadLocal变量定义成private static,这样就一直存在ThreadLocal的强引用,也就能保证任何时候都能通过ThreadLocal的弱引用访问到Entry的value值,进而清除掉 。

内存泄露的影响

资源不释放,随着时间增加,内存占用也会增加,导致系统性能下降,出现卡顿或响应缓慢等问题系统资源耗尽最终导致内存溢出。

问题排查

如果线上出了问题,首先判断是业务问题还是整个系统的问题。如果是业务问题,就去看应用的日志等进行排查。如果出现了如下问题,就可能是整个系统的问题:

  1. 大量接口都很慢
  2. 页面打不开
  3. 是否CPU占用过高
  4. 是否内存占用过高
  5. 是否磁盘占用过高
  6. 是否网络故障
  7. 查看后台日志
  8. 是否是数据库问题(比如:索引失效、死锁)
  9. 是否是垃圾回收导致
  10. 是否死锁等

Java线上服务问题处理 java线上问题排查

JVM的调优

  • Xms
    初始堆大小。
  • Xmx
    最大堆大小。
    一般将Xms和Xmx设为一样的值,若-Xms比较小,又需要初始化很多对象,jvm就必须反复增加内存。一样大也可避免每次垃圾回收完成后JVM重新分配内存。
  • Xss
    线程的栈的大小。
  • XX:NewSize=n
    设置年轻代大小
  • Xmn
    设置年轻代初始大小和最大大小。增大年轻代后,会减小年老代大小,此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
    等效于: 使用 -XX:NewSize 设置初始化大小并使用-XX:MaxNewSize 设置最大大小。
  • XX:NewRatio=n
    设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
  • XX:SurvivorRatio=n
    年轻代中Eden区与两个Survivor区的比值。
  • XX:MetaspaceSize=n
    元空间大小。
  • XX:MaxMetaspaceSize=n
    最大元空间大小。

java四种引用类型

  • 强引用
    强引用是使用最普遍的引用,我们写的代码,99.9999%都是强引用
    只要某个对象有强引用与之关联,这个对象永远不会被回收,即使内存不足,JVM宁愿抛出OOM,也不会去回收。
  • 软引用
    只有在内存不足时,JVM才会回收该对象。
    当内存不足时,会触发JVM的GC,如果GC后,内存还是不足,就会把软引用包裹的对象给干掉。
  • 弱引用
    不管内存是否足够,只要发生GC,弱引用就会被回收。
  • 虚引用
    无法通过虚引用来获取对一个对象的真实引用。
    虚引用必须与ReferenceQueue一起使用。当GC准备回收一个对象时,如果发现它还有虚引用,就会在回收之前,把这个虚引用加入到与之关联的ReferenceQueue中。

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

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

相关文章

找准方向选CRM客户管理系统!2023年排行榜推荐

本文将为大家带来2023有哪些好用CRM客户管理系统?CRM系统排行榜基于品牌知名度、功能、产品实力、系统稳定性、用户体量等多重因素考量。其中Zoho CRM、红圈CRM等产品市场表现优异入选此次榜单。 1.Zoho CRM 公司成立时间:1996年 Zoho(卓豪…

【算法】AC自动机的优化:增量更新与删除

一、概述 AC自动机(Aho-Corasick Automation)是著名的多模匹配算法,源于贝尔实验室,并且在实际应用中得到广泛的引用,且具有以下特点: 只需要扫描一次文本,即可获取所有匹配该文本的模式串复杂…

CSS扩展选择器

文章目录 1. 并集选择器2. 交集选择器3. 后代选择器4. 子代选择器5. 兄弟选择器5.1. 相邻兄弟选择器5.2. 通用兄弟选择器 6. 属性选择器7. 伪类选择器7.1. 动态伪类7.2. 结构伪类7.3. 否定伪类 8. 伪元素选择器9. Google 改进案例 1. 并集选择器 选中多个选择器对应的元素。一…

如何在Linux上使用git远程上传至gitee托管(add-commit-push指令详解)

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …

力扣209. 长度最小的子数组

思路:题目是 数组和 > target,不是等于target 双指针法:用for循环中的 r 来界定右边界的下标,右边界每移动一位,左边界可能需要移动多位,所以内部再用while, 当满足 数组和>target时,记录…

C语言基础之结构体

文章目录 一、结构体1、结构体概述2、结构体类型的定义方式(1)先定义结构体类型,再定义结构体变量(2)结构体类型、变量同时定义(3)一次性结构体 3、结构体成员的初始化(1)结构体初始化(2)清空结…

Flutter 添加三方库后,运行不起来或缓慢问题(Gradle)

背景 在Flutter项目(包含Android平台)初期,经常发现在Flutter添加了一个三方库依赖之后,重新运行的时候就要等很久,或者直接报错。查看详细日志会发现,耗时一般都是由于新的三方库也有自己的Android的代码…

RISC-V Optimization Guide(笔记)

官网发表的文章地址:RISC-V Optimization Guide B站有人做过解读视频,这篇文章也是看视频时做的笔记:视频地址 一、标量整数优化 1.1 常量的具体化 使用lui/addiw将立即数加载至寄存器,当立即数低12位的最高位为1时&#xff0c…

数据库 | MYSQL这个复杂系统如何上手?

当你不知道从何入手研究或解决一个复杂系统的问题时,通常意味着你没有找到合适的切入点或者缺乏对系统整体和细节之间联系的理解。在这种情况下,一个有用的策略是寻找系统的基本原理或构成要素。 小时候,你可能也玩过玩具四驱车。有的四驱车…

Elasticsearch(10) match的使用

elasticsearch version&#xff1a; 7.10.1 Elastic Match是Elasticsearch中用于全文搜索的一种查询语法。它可以将搜索词进行分词&#xff0c;并与目标查询字段进行匹配。 match的语法 GET /<index>/_search {"query": {"match": {"<fiel…

从零开始利用MATLAB进行FPGA设计(三)将Simulink模型转化为定点数据类型

文章灵感来源于MATLAB官方免费教程&#xff1a;HDL Coder Self-Guided Tutorial 考虑到MATLAB官网的英文看着慢&#xff0c;再加上视频讲解老印浓浓的咖喱味&#xff0c;我决定记录利用MATLAB&Simulink&SystemGenerator进行FPGA数字信号处理的学习过程。 往期回顾&am…

Alias许可数量计算

在数字化时代&#xff0c;软件许可数量的合理配置是企业实现成本控制与合规运营的关键。然而&#xff0c;企业在计算软件许可数量时&#xff0c;往往面临诸多困惑。如何精确评估软件需求&#xff0c;确保合规使用&#xff0c;降低成本&#xff0c;成为了企业关注的焦点。Alias许…

grep和vim查找日志文件信息

grep和vim查找日志文件信息 前言&#xff1a;最近排查问题时&#xff0c;经常用到grep和vim查找日志&#xff0c;记录下。 #1、在当前目录下查询文件中是否包含&#xff1a;test内容 $grep -nr test #2、vim查看日志 #2.1、vim文件后&#xff0c;用大写GG&#xff0c;快速…

什么是响应式设计?响应式设计的基本原理是什么?如何做?

文章目录 一、是什么二、实现方式媒体查询百分比vw/vhrem小结 三、总结参考文献 一、是什么 响应式网站设计&#xff08;Responsive Web design&#xff09;是一种网络页面设计布局&#xff0c;页面的设计与开发应当根据用户行为以及设备环境(系统平台、屏幕尺寸、屏幕定向等)…

前端图片预加载和懒加载

前言 在说到对图片资源进行优化时&#xff0c;那就不得不提到图片预加载和图片懒加载&#xff0c;可能很多朋友都了解这两者&#xff0c;但是一直没有很清晰的概念&#xff0c;以及什么时候用&#xff0c;用在什么场景下&#xff0c;今天就来详细的了解一下吧&#xff01; 图…

软考高级:BPR 和 BPM概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

【四 (1)数据可视化之如何选用正确的图表】

目录 文章导航一、数据分析中可视化的作用1、揭示数据关联和模式2、支持数据分析和决策3、提升沟通和共享效果4、强调关键信息和发现5、增强故事叙述和记忆效果6、有效增强数据交互性数据7、复杂信息易理解8、数据多维度显示 二、如何选用合适的图表1、简洁性避免使用过于复杂或…

软考高级:企业应用集成概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

八 超级数据查看器   讲解稿   详情3  分享和外观

八 超级数据查看器 讲解稿 详情3 分享和外观 app下载地址 下载地址4 ​ 讲解稿全文&#xff1a; 第3讲 分享 顶栏颜色 外观设置 现在讲解分享功能。点击&#xff0c;会打开分享对话框&#xff0c;我们这里演示2个&#xff0c;可以按照标题做出分享&#xff0c;在第一组…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Badge)

可以附加在单个组件上用于信息标记的容器组件。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 支持单个子组件。 说明&#xff1a; 子组件类型&#xff1a;系统组件和自定义组件&#xf…