JVM相关问题

news2024/9/25 11:16:51

JVM相关问题

  • 一、Java继承时父子类的初始化顺序是怎样的?
  • 二、JVM类加载的双亲委派模型?
  • 三、JDK为什么要设计双亲委派模型,有什么好处?
  • 四、可以打破JVM双亲委派模型吗?如何打破JVM双亲委派模型?
  • 五、什么是内存溢出?什么是内存泄漏?
    • 内存溢出(OOM):OutOfMemory
    • 内存泄露:Memory Leak
  • 六、线上项目JVM都怎么设置的?
  • 七、线上Java项目服务器内存飙升怎么排查处理?
  • 八、线上Java项目服务器CPU飙到100%怎么排查?
  • 九、JVM发生OOM后,其他线程是否可以继续工作?
  • 十、高并发系统的JVM如何优化?
    • 1、内存预估
    • 2、内存分配
    • 3、内存占用动态推算
    • 4、如何调优?

一、Java继承时父子类的初始化顺序是怎样的?

  1. 父类–静态变量
  2. 父类–静态初始化块
  3. 子类–静态变量
  4. 子类–静态初始化块
  5. 父类–变量
  6. 父类–初始化块
  7. 父类–构造器
  8. 子类–变量
  9. 子类–初始化块
  10. 子类–构造器

二、JVM类加载的双亲委派模型?

在这里插入图片描述

三、JDK为什么要设计双亲委派模型,有什么好处?

1、确保安全,避免Java核心类库被修改;

2、避免重复加载;

3、保证类的唯一性;

如果你写一个java.lang.String的类去运行,发现会抛出如下异常;
在这里插入图片描述

四、可以打破JVM双亲委派模型吗?如何打破JVM双亲委派模型?

答案:可以

想要打破这种模型,那么就自定义一个类加载器,重写其中的loadClass方法,使其不进行双亲委派即可;

五、什么是内存溢出?什么是内存泄漏?

内存溢出(OOM):OutOfMemory

指程序在申请内存时,没有足够的内存空间供其使用,抛出OutOfMemory错误;

比如申请了一个8MB空间,但是当前内存可用空间只有5MB,那么就是内存溢出;
在这里插入图片描述
即:OutOfMemoryError,是指没有空闲内存,垃圾收集器回收后也不能提供更多的内存空间;

内存泄露:Memory Leak

指程序运行后,没有释放所占用的内存空间,一次内存泄漏可能不会有很大的影响,但长时间的内存泄漏,堆积到一定程度就会产生内存溢出;
在这里插入图片描述
(1)单例对象,生命周期和应用程序一样长,如果单例对象持有对外部对象的引用的话,那么这个外部对象是不能被回收的,则会产生内存泄露;

(2)一些资源未关闭也会导致内存泄漏,比如数据库连接,网络连接socket和IO流的连接都必须在 finally 中 close,否则不能被回收的;

六、线上项目JVM都怎么设置的?

假设线上:4核8G机器;

JVM:栈、堆、元空间;

1、: 1m(默认大小),-Xss512k,一个线程是1m,一个线上项目 Tomcat 可能有300个线程,300m;

2、:大概把机器的一半内存给堆,4G(新生代、老年代);

  • CMS:1/3 、2/3
  • G1: 6:4

3、元空间: 一般512M肯定够了;

此时JVM参数如下:-Xms4096M -Xmx4096M -Xss1M -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M -XX:+UseG1GC

七、线上Java项目服务器内存飙升怎么排查处理?

在Linux系统中使用命令:

#(查看系统Java相关的进程)
jps 

在Linux系统中使用命令:

# 查看进程内存占用情况
top

可使用快捷键排序:shift + m

在Linux系统中使用命令:

# 查看内存信息
jmap -histo pid
  • jmap 是Java虚拟机(JVM)自带的一个命令行工具,用于生成Java进程的内存映像文件(heap dump),它通过与Java进程通信获取内存信息,并将信息输出到文件中,以便后续离线分析。
  • -histo 查看堆内存中的对象实例数目、内存占用大小、类名等;

在Linux系统中使用命令:

# 将内存信息转存文件
jmap -dump:format=b,file=heap.hprof pid

通过使用 MemoryAnalyzer(MAT)工具分析转存下来的文件。

八、线上Java项目服务器CPU飙到100%怎么排查?

# 查看进程内存占用情况
top

# 打印线程栈信息,输出到fileName.txt文件中
jstack pid > fileName.txt

# 查看pid进程中的线程内存占用情况
top -H -p pid

# 把十进制线程ID转换为十六进制
printf '%x' tid

九、JVM发生OOM后,其他线程是否可以继续工作?

要分情况看,不一定;

  • 如果发生OOM,例如使用局部变量存放对象,方法执行后内存会释放,那么其他线程可以继续工作;
  • 如果发生OOM,例如使用全局变量存放对象,方法执行后内存不会释放,那么其他线程不可以继续工作;

使用 VisualVM 工具查看JVM堆内存变化情况

十、高并发系统的JVM如何优化?

如果每秒发生 583000 请求:

1、内存预估

  • 普通4核8G服务器,一台机器抗300-400并发下单请求比较合理;

  • 583000 / 300 = 1943台机器;

  • 一个订单预估1KB;

  • 一台机器,300KB * 20 * 10 = 60MB的内存开销,一秒后60MB对象就成为垃圾;

2、内存分配

  • 4核8G的机器,JVM给4G,剩下几个G会留给操作系统;
  • 堆3G(新生代1.5G,老年代1.5G)
  • 栈1MB,JVM里大概会有300-500个线程,大概300-500MB;
  • 元空间/永久代512MB;
    • -Xms3072M -Xmx3072M -Xmn1536M -Xss1M
    • -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M
    • -XX:+PrintGCDetails
    • -XX:+PrintGCDateStamps
    • -Xloggc:d:/gc.log
    • -XX:+HeapDumpOnOutOfMemoryError
    • -XX:HeapDumpPath=d:/heap.hprof

3、内存占用动态推算

  • 一台机器每秒抗300个订单,300KB * 20 * 10 = 60MB,每秒占据新生代60MB内存空间,新生代总共有1.5G的内存空间;
  • 1.5G * 1024MB / 60MB = 25秒 新生代Eden占满,触发Minor GC;
  • 一般情况下一次可以回收掉90%的新生代对象,存活对象 = 1.5G * 1024MB * 10% = 150MB;
  • 如果 “-XX:SurvivorRatio” 参数默认值为8,那么:新生代Eden=1.2GB、S0 = 150MB、S1 = 150MB;
    在这里插入图片描述

4、如何调优?

(1):

  • 1次Minor GC后,可能Survivor不足或者触发动态年龄判断,对象进入老年代,明显是 Survivor 空间不足;

  • 新生代调整为2G,老年代为1G,此时Eden:1.6G,每个Survivor:200MB;

  • 解决 Survivor 不足或者触发动态年龄判断,降低新生代对象进入老年代的概率;

  • 此时JVM参数:

    -Xms3072M -Xmx3072M -Xmn2048M -Xss1M -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M
    

(2):

  • 一般系统里的@Service、@Controller之类的注解需要长期存活,这些对象一般也不会很多,可能几十兆,应该让它们尽快进入老年代;
  • 此时JVM参数:
    -Xms3072M -Xmx3072M -Xmn2048M -Xss1M -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -XX:MaxTenuringThreshold=5
    

(3):

  • 一般情况下,大对象可能需要长期存活和使用,让它直接进入老年代;(根据项目实际情况来确定)

  • 此时JVM参数如下:

    -Xms3072M -Xmx3072M -Xmn2048M -Xss1M -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -XX:MaxTenuringThreshold=5 -XX:PretenureSizeThreshold=1M
    

(4):

  • 指定合适的垃圾回收器;
  • 此时JVM参数 :
    -Xms3072M -Xmx3072M -Xmn2048M -Xss1M -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -XX:MaxTenuringThreshold=5 -XX:PretenureSizeThreshold=1M -XX:+UseParNewGC -XX:+UseConcMarkSweepGC
    
  • 小堆内存不使用G1垃圾收集器;

(5):

  • 大概每隔几分钟Minor GC之后有大概200MB左右对象进入老年代,推算可能差不多1小时后,才会有接近1GB的对象进入老年代,触发Full GC,然后高峰期一过,可能需要几个小时才会一次Full GC;
-Xms3072M -Xmx3072M -Xmn2048M -Xss1M -XX:-UseCompressedClassPointers -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=5 -XX:PretenureSizeThreshold=1M -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:d:/gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/heap.hprof

(6): 优化思路

  • 1、尽可能让对象在新生代里分配和回收,避免对象频繁进入老年代导致老年代频繁垃圾回收;
  • 2、给系统充足的内存空间,避免新生代频繁的垃圾回收;
  • 3、指定合适的垃圾收集器;

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

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

相关文章

【数据结构】前缀树的模拟实现

目录 1、什么是前缀树? 2、模拟实现 2.1、前缀树节点结构 2.2、字符串的添加 2.3、字符串的查寻 2.3.1、查询树中有多少个以字符串"pre"作为前缀的字符串 2.3.2、查询某个字符串被添加过多少次 2.4、字符串的删除 3、完整代码 1、什么是前缀树&…

(资源篇)2025届暑假实习春招全攻略路线

绝对的全攻略,资源完善程度绝对的全网唯一。 觉得有帮助的:随手一键三连关注就是对up主最大的激励。 绝对的宝藏up主!!!,up主每天都会进行更新视频,算法视频or校招信息or八股讲解。 【暴躁老…

数字化转型导师坚鹏:如何制定证券公司数字化转型年度培训规划

如何制定与实施证券公司数字化转型年度培训规划 ——以推动证券公司数字化转型战略落地为核心,实现知行果合一 课程背景: 很多证券公司都在开展数字化转型培训工作,目前存在以下问题急需解决: 缺少针对性的证券公司数字化转型…

账单怎么记账软件下载,佳易王账单记账汇总统计管理系统软件教程

账单怎么记账软件下载,佳易王账单记账汇总统计管理系统软件教程 一、前言 以下软件以 佳易王账单记账汇总统计管理系统软件V17.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 软件特色: 1、功能实用,操作…

第二天 Kubernetes落地实践之旅

第二天 Kubernetes落地实践之旅 本章学习kubernetes的架构及工作流程,重点介绍如何使用Workload管理业务应用的生命周期,实现服务不中断的滚动更新,通过服务发现和集群内负载均衡来实现集群内部的服务间访问,并通过ingress实现外…

one4all 排坑记录

one4all 排坑记录 任务踩坑回顾动作踩坑动作踩坑动作新一步测试Habitat-sim 测试habitat-lab继续ONE4ALL 任务 看了《One-4-All: Neural Potential Fields for Embodied Navigation》这篇论文,感觉挺有意思,他也开源了代码。视觉语言导航是我一直想做的…

CSS_实现三角形和聊天气泡框

如何用css画出一个三角形 1、第一步 写一个正常的盒子模型&#xff0c;先给个正方形的div&#xff0c;便于观察&#xff0c;给div设置宽高和背景颜色 <body><div class"box"></div> </body> <style>.box {width: 100px;height: 100px…

第三百七十九回

文章目录 1. 概念介绍2. 使用方法3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 013pickers2.gif 我们在上一章回中介绍了"如何实现Numberpicker"相关的内容&#xff0c;本章回中将介绍wheelChoose组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念…

sql 注入 之sqli-labs/less-5 双注入,也称:报错注入

该关卡返回正确或者错误页面,还有错误的代码&#xff0c;所以可以使用报错注入。报错注入的方式&#xff1a; updatexml 函数注入&#xff1a; mysql5.1.5 版本以上支持该函数&#xff0c;返回数据限制32位 模板&#xff1a;select * from user where id1 and (updatexml(&q…

MySQL:开始深入其数据(三)DQL的后续

上一章学习mysql语句里的where和join,这一章我们开始分析group by ,having,order by,limit语句。 three,too,one,go! 文章目录 重温select语法having:order by:limit 重温select语法 SELECT [ALL | DISTINCT] { * | table.* | [ table.field1 [ as alias1] [, table.field2 [a…

[通用] iPad 用于 Windows 扩展屏解决方案 Moonlight + Sunshine + Easy Virtual Display

文章目录 前言推流端 Sunshine 安装设置接收端安装 Moonlight安装虚拟屏幕软件 Easy Virtual Display 前言 上期博客讲了如何利用原生的 NVIDIA’s GameStream 传输协议实现 iPad 当作 Windows 副屏&#xff0c;对于非N卡用户&#xff0c;有一个软件 Sunshine 可以代替 Nvidia…

【详识JAVA语言】面向对象程序三大特性之二:继承

继承 为什么需要继承 Java中使用类对现实世界中实体来进行描述&#xff0c;类经过实例化之后的产物对象&#xff0c;则可以用来表示现实中的实体&#xff0c;但是 现实世界错综复杂&#xff0c;事物之间可能会存在一些关联&#xff0c;那在设计程序是就需要考虑。 比如&…

GO泛型相关

通过引入 类型形参 和 类型实参 这两个概念&#xff0c;我们让一个函数获得了处理多种不同类型数据的能力&#xff0c;这种编程方式被称为 泛型编程。 2. Go的泛型 类型形参 (Type parameter)类型实参(Type argument)类型形参列表( Type parameter list)类型约束(Type constr…

【IEEEE会议征稿】第六届下一代数据驱动网络国际学术会议(NGDN 2024)

第六届下一代数据驱动网络国际学术会议&#xff08;NGDN 2024&#xff09; The Sixth International Conference on Next Generation Data-driven Networks 基于前几届在英国埃克塞特 (ISPA 2020) 、中国沈阳 (TrustCom 2021) 和中国武汉(IEEETrustCom-2022)成功举办的经验&a…

048 异常

什么是异常 异常体系结构 异常的继承关系 Error Exception 异常处理机制 try&#xff1a;用{}将可能产生异常的代码包裹catch&#xff1a;与try搭配使用&#xff0c;捕获try包裹代码中抛出的异常并进行后续动作finally&#xff1a;跟在try后&#xff0c;在try和catch之后执行…

使用 Grafana 使用JSON API 请求本地接口 报错 bad gateway(502)解决

一 . 问题&#xff1a; 在用docker部署Grafana 来实现仪表盘的展示&#xff0c;使用到比较多的就是使用JAON API插件调用本地部署的API&#xff0c;比如访问localhost下的 /test_data 接口&#xff0c;一般我们使用的是http://localhost:8080/test_data&#xff0c; 但是在访…

java 使用easyui开发导出excle打开错误

解决&#xff1a; contentType 加字符编码 ;charsetutf-8 就好了

[AutoSar]BSW_Com08 CAN driver 模块介绍及参数配置说明 (一)

目录 关键词平台说明一、缩写和定义二、CAN driver 所在位置三、CAN 模块的主要功能四、功能规格4.1 Driver State Machine4.2 CAN控制器状态机4.3 CAN控制器状态机转换4.3.1 调用function Can_Init 导致的状态转换4.3.2 调用Can_ChangeBaudrate导致的状态转换4.3.3 调用Can_Se…

无穷积分例子

以下几个题容易出错&#xff0c;特意记录一下。 判断积分式的敛散性 ∫ − ∞ ∞ 1 x 2 e 1 x d x \int _{-\infty } ^ {\infty} \frac{1}{x^2} e ^{\frac{1}{x}} dx ∫−∞∞​x21​ex1​dx 要注意瑕点0的处理。无穷积分&#xff0c;一般将积分域按瑕点拆分并分别积分。 判断…

谷粒商城【成神路】-【8】——商品上架

目录 1.数据模型封装 1.es数据模型 2.将es数据模型封装为JAVA bean 3.根据前端发送请求,编写controller 2.模型实现 2.1服务controller 2.2服务service 2.3服务远程调用接口 2.4检索服务controller 2.5检索服务保存到es 2.6库存查询服务 1.数据模型封装 1.es数据模…