面试官:我就问了一个JVM性能调优,没想到他能吹半个小时

2023-10-27

一、JVM内存模型及垃圾收集算法

1.根据Java虚拟机规范,JVM将内存划分为:

  • New(年轻代)
  • Tenured(年老代)
  • 永久代(Perm)

其中New和Tenured属于堆内存,堆内存会从JVM启动参数(-Xmx:3G)指定的内存中分配,Perm不属于堆内存,由虚拟机直接分配,但可以通过-XX:PermSize -XX:MaxPermSize 等参数调整其大小。

  • 年轻代(New):年轻代用来存放JVM刚分配的Java对象
  • 年老代(Tenured):年轻代中经过垃圾回收没有回收掉的对象将被Copy到年老代
  • 永久代(Perm):永久代存放Class、Method元信息,其大小跟项目的规模、类、方法的量有关,一般设置为128M就足够,设置原则是预留30%的空间。

New又分为几个部分:

  • Eden:Eden用来存放JVM刚分配的对象
  • Survivor1
  • Survivro2:两个Survivor空间一样大,当Eden中的对象经过垃圾回收没有被回收掉时,会在两个Survivor之间来回Copy,当满足某个条件,比如Copy次数,就会被Copy到Tenured。显然,Survivor只是增加了对象在年轻代中的逗留时间,增加了被垃圾回收的可能性。

2.垃圾回收算法

垃圾回收算法可以分为三类,都基于标记-清除(复制)算法:

  • Serial算法(单线程)
  • 并行算法
  • 并发算法

JVM会根据机器的硬件配置对每个内存代选择适合的回收算法,比如,如果机器多于1个核,会对年轻代选择并行算法,关于选择细节请参考JVM调优文档。

稍微解释下的是,并行算法是用多线程进行垃圾回收,回收期间会暂停程序的执行,而并发算法,也是多线程回收,但期间不停止应用执行。所以,并发算法适用于交互性高的一些程序。经过观察,并发算法会减少年轻代的大小,其实就是使用了一个大的年老代,这反过来跟并行算法相比吞吐量相对较低。

还有一个问题是,垃圾回收动作何时执行?

  • 当年轻代内存满时,会引发一次普通GC,该GC仅回收年轻代。需要强调的是,年轻代满是指Eden代满,Survivor满不会引发GC
  • 当年老代满时会引发Full GC,Full GC将会同时回收年轻代、年老代
  • 当永久代满时也会引发Full GC,会导致Class、Method元信息的卸载

另一个问题是,何时会抛出OutOfMemoryException,并不是内存被耗空的时候才抛出

  • JVM98%的时间都花费在内存回收
  • 每次回收的内存小于2%

满足这两个条件将触发OutOfMemoryException,这将会留给系统一个微小的间隙以做一些Down之前的操作,比如手动打印Heap Dump。

二、内存泄漏及解决方法

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面试官:我就问了一个JVM性能调优,没想到他能吹半个小时 的相关文章

  • Java TestNG 与跨多个测试的数据驱动测试

    我正在电子商务平台中测试一系列商店 每个商店都有一系列属性 我正在考虑对其进行自动化测试 是否有可能有一个数据提供者在整个测试套件中提供数据 而不仅仅是 TestNG 中的测试 我尝试不使用 testNG xml 文件作为机制 因为这些属性
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • 如何将 pfx 文件转换为 jks,然后通过使用 wsdl 生成的类来使用它来签署传出的肥皂请求

    我正在寻找一个代码示例 该示例演示如何使用 PFX 证书通过 SSL 访问安全 Web 服务 我有证书及其密码 我首先使用下面提到的命令创建一个 KeyStore 实例 keytool importkeystore destkeystore
  • 在f字符串中转义字符[重复]

    这个问题在这里已经有答案了 我遇到了以下问题f string gt gt gt a hello how to print hello gt gt gt f a a gt gt gt f a File
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • 如何在seaborn displot中使用hist_kws

    我想在同一图中用不同的颜色绘制直方图和 kde 线 我想为直方图设置绿色 为 kde 线设置蓝色 我设法弄清楚使用 line kws 来更改 kde 线条颜色 但 hist kws 不适用于显示 我尝试过使用 histplot 但我无法为
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • 如何在 Python 中追加到 JSON 文件?

    我有一个 JSON 文件 其中包含 67790 1 kwh 319 4 现在我创建一个字典a dict我需要将其附加到 JSON 文件中 我尝试了这段代码 with open DATA FILENAME a as f json obj js
  • 为字典中的一个键附加多个值[重复]

    这个问题在这里已经有答案了 我是 python 新手 我有每年的年份和值列表 我想要做的是检查字典中是否已存在该年份 如果存在 则将该值附加到特定键的值列表中 例如 我有一个年份列表 并且每年都有一个值 2010 2 2009 4 1989
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • 有人用过 Dabo 做过中型项目吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们正处于一个新的 ERP 风格的客户端 服务器应用程序的开始阶段 该应用程序是作为 Python 富客户端开发的 我们目前正在评估 Dabo
  • 如何从终端运行处理应用程序

    我目前正在使用加工 http processing org对于一个小项目 但是我不喜欢它附带的文本编辑器 我使用 vim 编写所有代码 我找到了 pde 文件的位置 并且我一直在从 vim 中编辑它们 然后重新打开它们并运行它们 重新加载脚
  • 玩!框架:运行“h2-browser”可以运行,但网页不可用

    当我运行命令时activator h2 browser它会使用以下 url 打开浏览器 192 168 1 17 8082 但我得到 使用 Chrome 此网页无法使用 奇怪的是它以前确实有效 从那时起我唯一改变的是JAVA OPTS以启用
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • 使用其构造函数初始化 OrderedDict 以便保留初始数据的顺序的正确方法?

    初始化有序字典 OD 以使其保留初始数据的顺序的正确方法是什么 from collections import OrderedDict Obviously wrong because regular dict loses order d O
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo
  • 导入错误:没有名为 site 的模块 - mac

    我已经有这个问题几个月了 每次我想获取一个新的 python 包并使用它时 我都会在终端中收到此错误 ImportError No module named site 我不知道为什么会出现这个错误 实际上 我无法使用任何新软件包 因为每次我
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List

随机推荐

  • 八目云播服务器维护,LiveQing 云平台直播点播使用说明

    LiveQing 云平台直播点播使用说明 下载安装包 zip 是windows环境中使用的安装包 tar gz 是linux环境中使用的安装包 Windows下安装 说明 Windows 64位 系统 下载的安装包放置在任意一个目录下 解压
  • CSS笔记

    2 3 4 5
  • 在Spark上运行apache beam

    目录 apache beam 个人使用经验总结目录和入门指导 Java 为了方便 以下面这个名字替换的程序做简单例子 The ReplaceMyName 把Create数组里的myName替换成xxx since 2019 12 17 pu
  • [C语言]define 定义常量/宏

    1 运用define定义常量 2 运用define定义宏 1 运用define定义常量 格式 define 符号 数值 define A 100 定义后的常量 作用域在整个项目 可以跨源文件调用 2 运用define定义宏 宏与函数其实十分
  • 学习PWM——控制的关键

    目录 一 PWM的简介 1 PWM是什么 2 PWM的参数 1 PWM的频率 2 PWM的周期 3 占空比 3 PWM的原理 1 高级输出比较通道 2 通用输出比较通道 3 输出比较模式 二 PWM的结构 1 PWM的基本结构 2 参数计算
  • Blip2 文章阅读

    论文地址https arxiv org pdf 2301 12597 pdf BLIP 2 Bootstrapping Language Image Pre training with Frozen Image Encoders and L
  • 【PyTorch教程】05-如何使用PyTorch训练神经网络模型 (2022年最新)

    本期目录 使用PyTorch训练神经网络 torch autograd 1 神经网络背景 2 加载预训练模型 有重大更新 2 1 新老版本写法对比 2 2 新写法的好处 2 3 图像数据的预处理 2 4 训练模式和验证模式之间的转换 3 正
  • 机器学习技术(六)——有监督学习算法之线性回归算法实操

    机器学习技术 五 有监督学习之线性回归算法实操 引言 机器学习监督算法是一种基于已有标记数据的学习方法 通过对已知输入和输出数据的学习 建立一个模型来预测新的输入数据的输出 这种算法模仿人类的学习过程 从已有的经验中总结规律 并将其应用于新
  • python在excel表里如何新增一列或者一行?新增之后,公式和合并单元格会怎样变化?

    首先导入openpyxl库 即 import openpyxl as op 然后打开你已有的excel 即 wb op open 新增一列 xlsx 打开新增一列 xlsx这个工作簿 ws wb Sheet1 打开Sheet1这个工作表 我
  • 2020-09-06

    Nexus仓库管理服务 1 Nexus端口为8081 Nexus是Maven仓库管理器 如果你使用Maven 你可以从Maven中央仓库下载所需要的构件 artifac 但这通常不是一个好的做法 你应该在本地假设一个Maven仓库服务器 在
  • 静态代码分析工具列表分析---代码分析工具列表(30款工具)

    本文是一个静态代码分析工具的清单 共有30个工具 包括4个 NET工具 2个Ada工具 7个C 工具 4个Java工具 2个JavaScript工具 1个Opa工具 2个Packaging工具 3个Perl工具 1个Python工具 1个嵌
  • qt采用opengl显示yuv视频数据

    作者 使徒保罗 邮箱 297329588szh 163 com 声明 欢迎交流学习 如有任何疑问 请通过邮箱联系本人 应用场景 qt opengl渲染yuv420p数据 开发环境 win7 64位 qt opensource windows
  • WEB-CTF通关教程二

    信息泄露的第二关 进去页面如下 查看源代码发现后缀为 sql的文件 看见这个文件思路就是把这个文件下载下来查看敏感数据 尝试在链接后直接加文件名 发现直接下载了我们的文件 使用记事本打开文件 得到flag值 暴力破解第二关 打开页面提示如下
  • 将手机号中间四位进行隐藏操作(Java)

    import java util Scanner public class StringExample2 public static void main String args 将手机号中间四位数字用 来替代 用截取字符串的方法 将前三位和
  • 有点问题的代码

    一个有问题的程序 import javax swing import java awt event import java awt class EditBook public static void main String args Edi
  • 详解 http-server的安装和使用

    简介 http server 命令行http服务器 http server是一个简单的零配置命令行http服务器 它足够强大 足以用于生产用途 但它既简单又易于破解 可用于测试 本地开发和学习 使用前提 http server 基于node
  • Android:位置服务

    前言 在开发 Android 位置相关应用时 可以从 GPS 全球定位系统 passive network 获取用户位置 通过 GPS 能获得最精确的信息 LocationProvider 是位置源的意思 用来提供定位信息 常用的 Loca
  • Apriori算法是什么?适用于什么情境?

    Apriori适用于什么场景 Apriori算法是常用的用于挖掘出数据关联规则的算法 它用来找出数据值中频繁出现的数据集合 找出这些集合的模式有助于我们做一些决策 例如什么商品集合顾客会在同一次购物中购买 最著名的例子莫过于啤酒与尿布的故事
  • Android蓝牙开发的一些经验

    http blog csdn net icyfox bupt article details 25487125 先说一下背景 我是开发手机与带蓝牙的智能设备 蓝牙血压计 血糖仪 手环等 设备对接的APP 也就是说 在设备端没有什么可以操作的
  • 面试官:我就问了一个JVM性能调优,没想到他能吹半个小时

    一 JVM内存模型及垃圾收集算法 1 根据Java虚拟机规范 JVM将内存划分为 New 年轻代 Tenured 年老代 永久代 Perm 其中New和Tenured属于堆内存 堆内存会从JVM启动参数 Xmx 3G 指定的内存中分配 Pe