JVM相关问题

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.mzph.cn/news/717316.shtml

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

相关文章

Spring Cloud Gateway-系统保护Sentinel集成

文章目录 Sentinel介绍Spring Cloud Gateway集成Sentinelpom依赖Sentinel配置Sentinel集成Nacos作为数据源自定义降级响应 Sentinel介绍 ​ 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&a…

HTML5:七天学会基础动画网页6

CSS3自定义字体 ①:首先需要下载所需字体 ②:把下载字体文件放入 font文件夹里,建议font文件夹与 css 和 image文件夹平级 ③:引入字体,可直接在html文件里用font-face引入字体,分别是字体名字和路径 例…

Django官网项目

项目准备 使用VSCODE做IDE。 检查Python版本。 sudo apt install sudo apt update python3 --version创建项目路径,创建虚拟环境,创建项目 路径 \mysite 进入路径,运行VSCODE 运行 "code ." 创建虚拟环境。 选择 >python: c…

【推荐算法系列十七】:GBDT+LR 排序算法

排序算法经典中的经典 参考 推荐系统之GBDTLR 极客时间 手把手带你搭建推荐系统 课程 逻辑回归(LR)模型 逻辑回归(LR,Logistic Regression)是一种传统机器学习分类模型,也是一种比较重要的非线性回归模型&#xff…

AAAI2024-分享若干篇有代码的优秀论文-图神经网络、时间序列预测、知识图谱、大模型等

图神经网络、大模型优化方向系列文章目录 为了方便大家根据自己的兴趣查看自己的研究方向论文,在这里进行了细分。如果有对其中的论文感兴趣的,可以查看对应的文章在论文相应的代码,方便快速上手学习,也可以借助这些代码的学习快…

16 Educational Codeforces Round 142 (Rated for Div. 2)C. Min Max Sort(递归、思维、dp)

C. Min Max Sort 很不错的一道题目,不过脑电波和出题人每对上, q w q 。 qwq。 qwq。 正难则反。 我们考虑最后一步是怎么操作的。 最后一步一定是对 1 1 1和 n n n进行操作 那么上一步呢? 上一步应该是对 2 2 2和 n − 1 n-1 n−1 以此类推…

AMD“高级洞察”系列揭示Epyc Naples和Rome原型CPU早期无法启动问题

AMD在其新的YouTube视频系列《高级洞察》第一集中,由AMD首席技术官Mark Papermaster担任主持人,讨论了AMD在数据中心领域的突破性进展及其持续增长。然而,AMD在服务器业务的发展并非一帆风顺,两位高管公开讨论了早期Epyc Naples和…

【Python】环境管理怎么选择【virtualenv】【pipenv】【 poetry】【 conda】

前言 刚入门Python,看到PyCharm的环境管理选择有好几个选择,分别是virtualenv、pipenv、venv、conda,只知道这些都可以用来管理Python环境的,但不知道这些环境有什么区别,所以,本文将对这些环境管理进行总…

Avalonia学习(二十九)-仪表

Avalonia制作仪表盘&#xff0c;把控件给大家演示一下&#xff0c;Avalonia有三类自定义控件&#xff0c;分别是用户控件、模版控件、自主控件。前面已经很多用户控件了&#xff0c;这个是演示模版控件&#xff0c;另外一种不知道哪种情况下使用。 前端代码&#xff1a; <…

想从事数据方向职场小白看过来, 数据方面的一些英文解释

想从事数据方向职场小白看过来&#xff0c;一些英文名词解释 文章目录 想从事数据方向职场小白看过来&#xff0c;一些英文名词解释 英文类解释NoSQL&#xff1a;ESB&#xff1a;ACID &#xff1a;Data Vault&#xff1a;MDM&#xff1a;OLAP&#xff1a;SCD:SBA&#xff1a;MP…

【Django】执行查询——比较、删除、复制、批量修改对象

以下述模型为基础&#xff0c;讨论检索对象的方式方法&#xff1a; from datetime import datefrom django.db import modelsclass Blog(models.Model):name models.CharField(max_length100)tagline models.TextField()def __str__(self):return self.nameclass Author(mod…

【vue】v-if、v-show、v-for 相关所有面试题总结

v-if 和 v-show 的区别 两个重点【dom】和【生命周期】 v-if 惰性指令&#xff0c;false 不会被编译、渲染不会存在 DOM 中切换开销大&#xff0c;需要重新创建元素值变化&#xff0c;使用 v-if 的组件生命周期执行顺序 true 变为 false【组件的销毁】 beforeDestroy / befor…

[Flutter]shared_preferences基本用法以及可视化管理存储的key和value类型

shared_preferences 是一个Flutter插件&#xff0c;它提供了一种简单的方式来在应用程序中存储和获取持久化的键值对数据。它可以用于存储应用程序的配置信息、用户偏好设置、登录状态等。 使用 shared_preferences 插件&#xff0c;你可以在应用程序中轻松地保存和读取数据&a…

Java中线程相关的知识

创建子线程的三种方式: 1.自定义线程任务类继承线程类&#xff0c;以便继承其功能,重写其run方法(里面写自己需要实现的功能)&#xff0c;在main方法调用时创建其任务类实例化对象&#xff0c;然后调用对象的start方法(继承自父类)&#xff0c;即成功创建线程 优点:创建方式简…

Pandas DataFrame 基本操作实例100个

Pandas 是一个基于NumPy的数据分析模块&#xff0c;最初由AQR Capital Management于2008年4月开发&#xff0c;并于2009年底开源。Pandas的名称来源于“Panel Data”&#xff08;面板数据&#xff09;和“Python数据分析”&#xff08;data analysis&#xff09;。这个库现在由…

来不及了!大学必须完成的四件事!

老师们常说&#xff0c;上大学就轻松了 其实不然 大学不是人生的终点&#xff0c;而是新的起跑线 不是休息站&#xff0c;而是进入社会的最后冲刺跑道 大学生活苦乐参半&#xff0c;成人世界即将来临 出了校门&#xff0c;你会发现社会复杂多变&#xff0c;需要不断学习 稍…

excel中如何使用VLOOKUP和EXACT函数实现区分大小写匹配数据

在 Excel 中&#xff0c;VLOOKUP 函数默认情况下是不区分大小写的&#xff1a; 比如下面的案例&#xff0c;直接使用VLOOKUP函数搜索&#xff0c;只会搜索匹配到不区分大小写的第一个 如果我们想要实现区分大小写的精确匹配&#xff0c;可以使用 EXACT 函数结合 VLOOKUP 函数 …

【简说八股】Redisson的守护线程是怎么实现的

Redisson Redisson 是一个 Java 语言实现的 Redis SDK 客户端&#xff0c;在使用分布式锁时&#xff0c;它就采用了「自动续期」的方案来避免锁过期&#xff0c;这个守护线程我们一般也把它叫做「看门狗」线程。 Redission是一个在Java环境中使用的开源的分布式缓存和分布式锁实…

PyTorch-卷积神经网络

卷积神经网络 基本结构 首先解释一下什么是卷积&#xff0c;这个卷积当然不是数学上的卷积&#xff0c;这里的卷积其实表示的是一个三维的权重&#xff0c;这么解释起来可能不太理解&#xff0c;我们先看看卷积网络的基本结构。 通过上面的图我们清楚地了解到卷积网络和一般网…

【Javascript】设计模式之发布订阅模式

文章目录 1、现实中的发布&#xff0d;订阅模式2、DOM 事件3、简单的发布-订阅模式4、通用的发布-订阅模式5、先发布再订阅6、小结 发布—订阅模式又叫观察者模式&#xff0c;它定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于…