JVM相关问题
JVM相关问题
- 一、Java继承时父子类的初始化顺序是怎样的?
- 二、JVM类加载的双亲委派模型?
- 三、JDK为什么要设计双亲委派模型,有什么好处?
- 四、可以打破JVM双亲委派模型吗?如何打破JVM双亲委派模型?
- 五、什么是内存溢出?什么是内存泄漏?
- 内存溢出(OOM):OutOfMemory
- 内存泄露:Memory Leak
- 六、线上项目JVM都怎么设置的?
- 七、线上Java项目服务器内存飙升怎么排查处理?
- 八、线上Java项目服务器CPU飙到100%怎么排查?
- 九、JVM发生OOM后,其他线程是否可以继续工作?
- 十、高并发系统的JVM如何优化?
- 1、内存预估
- 2、内存分配
- 3、内存占用动态推算
- 4、如何调优?
一、Java继承时父子类的初始化顺序是怎样的?
- 父类–静态变量
- 父类–静态初始化块
- 子类–静态变量
- 子类–静态初始化块
- 父类–变量
- 父类–初始化块
- 父类–构造器
- 子类–变量
- 子类–初始化块
- 子类–构造器
二、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、指定合适的垃圾收集器;
相关文章:
JVM相关问题
JVM相关问题 一、Java继承时父子类的初始化顺序是怎样的?二、JVM类加载的双亲委派模型?三、JDK为什么要设计双亲委派模型,有什么好处?四、可以打破JVM双亲委派模型吗?如何打破JVM双亲委派模型?五、什么是内…...
32单片机基础:旋转编码器计次
接线图如上图所示。 我们初始化一下PB0和PB1两个GPIO口外设中断,当然,这里只初始化一个外部中断也能完成功能的对于编码器而言,下图所示为正转的波形。如果把一相的下降沿用作触发中断,在中断时刻读取另一相的电平,正…...
【C++】vector的使用和模拟实现(超级详解!!!!)
文章目录 前言1.vector的介绍及使用1.1 vector的介绍1.2 vector的使用1.2.1 vector的定义1.2.2 vector iterator 的使用1.2.3 vector 空间增长问题1.2.3 vector 增删查改1.2.4 vector 迭代器失效问题。(重点!!!!!!)1.2.5 vector 在OJ中有关的练习题 2.ve…...
GO学习记录
这里写目录标题 00 环境01 语言基础二级目录三级目录 00 环境 参考的:https://www.liwenzhou.com/posts/Go/install/ 编译运行: go mod init <项目名> // 在目录下创建项目 go mod init <项目名> // 编译go run <文件名>.go …...
迭代器模式(Iterator Pattern)
定义 迭代器模式(Iterator Pattern)是一种行为型设计模式,它提供了一种方法来顺序访问聚合对象中的各个元素,而不需要暴露该对象的内部表示。迭代器模式使得客户端代码能够独立于聚合对象的具体实现进行遍历操作。 在迭代器模式…...
KL divergence(KL 散度)详解
本文用一种浅显易懂的方式说明KL散度。 参考资料 KL散度本质上是比较两个分布的相似程度。 现在给出2个简单的离散分布,称为分布1和分布2. 分布1有3个样本, 其中A的概率为50%, B的概率为40%,C的概率为10% 分布2也有3个样本: 其…...
AzerothCore@FreeBSD安装记录
尝试在FreeBSD系统下安装AzerothCore 首先安装相关软件 pkg install cmake mysql80-server boost-all装完mysql之后提示: MySQL80 has a default /usr/local/etc/mysql/my.cnf, remember to replace it with your own or set mysql_optfile"$YOUR_CNF_FILE i…...
vue .env配置环境变量
最近使用的不同的环境有点多了,接口文件ip一直在替换打包,看了下文档,有个方案使用.env配置不同的环境运行打包 vue 现在已经兼容了env ,无需下载 创建文件(根目录) 创建.env.development,.env.…...
ThreadLocal介绍
文章目录 ThreadLocal源码分析:set方法get方法remove方法 ThreadLocal内存泄漏问题 ThreadLocal ThreadLocal提供了线程局部变量,每个线程都可以通过set和get方法来对这个变量进行操作,但不会和其他线程的局部变量冲突,实现了线程…...
【Linux系统化学习】线程概念
目录 线程的概念 线程的引出 什么是线程 理解线程比进程更加的轻量化 线程的优点 现成的缺点 线程异常 线程用途 Linux进程VS线程 线程的简单现象 线程的概念 有关操作系统的书籍或者课本都会这样描述线程: 线程是比进程轻量化的一种执行流线程是进程内部…...
Redis集群模式
分片 面试题:为什么Redis的最大槽位是16384? 翻译一下作者的话: 解读一下:...
执行go get xxx报错
1、执行命令 go get github.com/go-redis/redis/v8 报错 : go: coding.jd.com/xxx/xxxxxxv0.0.0-xxxxxxxxxx: invalid version: git ls-remote -q origin in /users/douhao7/go/pkg/mod/cache/vcs/xxxxxxxxxxxxxx: exit status 128: 致命错误:could not read use…...
MATLAB基础语法与实践
文章目录 初级篇MATLAB简介特点 安装和配置界面介绍 中级篇基础语法变量表达式函数 数据类型整数和浮点数复数字符串单元数组 高级篇脚本与函数编写脚本编写函数编写 图形绘制数据分析 实践篇实例演示1:矩阵运算实例演示2:数据可视化 初级篇 MATLAB简介…...
智能边缘小站 CloudPond(低延迟、高带宽和更好的数据隐私保护)
智能边缘小站 CloudPond(低延迟、高带宽和更好的数据隐私保护) 边缘小站的主要功能是管理用户在线下部署的整机柜设施,一个边缘小站关联一个华为云指定的区域和一个用户指定的场地,相关的资源运行状况监控等。 边缘计算 迈入5G和AI时代,新…...
回归预测 | Matlab实现RIME-BP霜冰算法优化BP神经网络多变量回归预测
回归预测 | Matlab实现RIME-BP霜冰算法优化BP神经网络多变量回归预测 目录 回归预测 | Matlab实现RIME-BP霜冰算法优化BP神经网络多变量回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab实现RIME-BP霜冰算法优化BP神经网络多变量回归预测(完整…...
LeetCode15:三数之和
题目描述 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组…...
【详识JAVA语言】面向对象程序三大特性之三:多态
多态 多态的概念 多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。 多态实现条件 在java中要实现多态,必须要满足如下几个条件,缺一不可…...
nginx(三)实现反向代理客户端 IP透传
正常情况下,客户端去访问代理服务器,然后代理服务器再取访问真实服务器,在真实服务器上,只能显示代理服务器的ip地址,而不显示客户端的ip地址,如果想让客户端的ip地址也能在真实服务端看见,这一…...
深入Java日志框架及其最佳实践
概述 在Java应用开发中,日志框架是确保应用稳定性和可观察性的关键组件。它帮助开发者记录应用的行为、诊断问题,并监控系统的健康状况。随着Java生态系统的不断发展,各种日志框架也应运而生,各有特点和优势。本文将详细探讨几个…...
threejs显示本地硬盘上的ply文件,通过webapi
由于ply文件是第三方提供的,threejs无法用绝路路径的方式显示ply 所以想通过webapi把ply通过url地址的方式给threejs 1.webapi部分 /// <summary>/// 获取PLY文件/// </summary>/// <returns></returns>[HttpPost(Name "GetPly&qu…...
Gemini SQL生成准确率暴跌87%?揭秘模型幻觉的4个致命诱因及实时校验方案
更多请点击: https://intelliparadigm.com 第一章:Gemini SQL生成准确率暴跌87%?揭秘模型幻觉的4个致命诱因及实时校验方案 近期多项基准测试显示,Gemini Pro 1.5 在复杂业务场景下的SQL生成任务中,准确率从历史平均9…...
【信息科学与工程学】计算机科学与自动化——第六十二篇 虚拟化算法02
虚拟化领域核心算法详解(续) 算法19: 虚拟机快照与还原算法 编号: 19 类型: 快照管理算法 虚拟化领域: 存储虚拟化 算法声明: 虚拟机快照算法用于创建虚拟机在某一时间点的完整状态,包括内存、磁盘和CPU寄存器状态,支持增量快照、差异快照和快照链管理,实现快…...
面向实时决策Agent的Harness微秒级调度
面向实时决策Agent的Harness微秒级调度:从原理到落地,打造低于10us延迟的智能决策系统 副标题:适配量化交易、自动驾驶、工业控制等高实时性场景,确定性延迟保障99.999%调度成功率 摘要/引言 你有没有遇到过这些场景:量化交易策略的决策逻辑晚了5us,原本可以盈利的订单…...
Chrome抓包失败原因与Burp代理设置全解析
1. 这不是“装个插件就完事”的操作,而是理解代理本质的第一课很多人点开Burp Suite,双击启动,看到界面就以为“抓包开始了”——结果在谷歌浏览器里按F12,Network标签页刷半天,连个请求影子都看不到;或者点…...
【限时解析】DeepSeek 2024 Q3计费规则更新:2项重大变更将影响92%高频用户
更多请点击: https://kaifayun.com 第一章:DeepSeek计费模式分析 DeepSeek 提供的 API 服务采用按量计费(Pay-as-you-go)模式,核心计费维度为模型调用所消耗的 Token 总数,包含输入(prompt&…...
告别黄牛票:用DamaiHelper脚本轻松抢到大麦网演唱会门票
告别黄牛票:用DamaiHelper脚本轻松抢到大麦网演唱会门票 【免费下载链接】DamaiHelper 大麦网演唱会演出抢票脚本。 项目地址: https://gitcode.com/gh_mirrors/dama/DamaiHelper 还在为抢不到心仪的演唱会门票而烦恼吗?面对秒光的票源和黄牛的高…...
《元创力》纪实录·卷宗2.1对话态对位法的预习:在“审查通过”与“舆论倒查”之间
叙事背景:最近关于姚晨因《监狱来的妈妈》在国际获奖而微博发声评论引发广泛关注和讨论,由于媒体出现一份判决文书,群众发现《监狱来的妈妈》电影的叙事内容与判决文书不符,引发了舆论声讨,姚晨被迫道歉,删…...
惠普OMEN游戏本性能控制终极指南:5分钟解锁风扇调速与功耗限制
惠普OMEN游戏本性能控制终极指南:5分钟解锁风扇调速与功耗限制 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub …...
解锁音乐自由:3分钟掌握QQ音乐加密音频无损解密技巧 [特殊字符]
解锁音乐自由:3分钟掌握QQ音乐加密音频无损解密技巧 🎵 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder 你是否曾为QQ音乐下载的歌曲只能在特定播放器…...
10分钟快速掌握VideoDownloadHelper:浏览器视频下载终极指南
10分钟快速掌握VideoDownloadHelper:浏览器视频下载终极指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾遇到过这样的…...
