一份关于jvm内存调优及原理的学习笔记

2023-11-17

JVM

 

一.虚拟机的基本结构

 

1.jvm整体架构

 

 

类加载子系统:负责从文件系统或者网络中加载class信息,存入方法区中。

方法区(Perm):存放加载后的class信息,包括静态方法,jdk1.6以前包含了常量池。

参数:-XX:PermSize初始值  -XX:MaxPermSize最大值

 

Java堆(Heap):java工程的主要内存工作区域,所有线程共享,jdk1.7以后包含了常量池。参数: -Xms初始值     -Xmx最大值

 

直接内存:java堆外,直接向系统申请的内存区间,允许NIO库使用。申请空间慢,读写快。默认下最大可用空间等于堆的最大可用空间。在server模式下,读写速度是堆的10倍。

参数:-XX:MaxDirectMemorySize 最大值

 

垃圾回收器:

 

Java栈:线程私有,用于存放局部变量,方法参数,同时和java方法的调用返回密切相关。

参数:-Xss最大值

 

本地方法栈:和java栈类似,主要用于本地方法调用。

PC寄存器:线程私有

执行引擎:

 

 

Java [-options] class [args...]

其中-options是java虚拟机的启动参数,args是传递给main方法的参数、

 

 

2.java堆

根据垃圾回收机制的不同,java堆有可能拥有不同的结构,常见的java堆分为新生代和老年代。其中新生代存放刚创建的对象及年龄不大的对象,老年带存放着在新生代中经历过多次回收后还存在的对象。

 

 

 

对象晋升过程:

新生代分为eden区s0,s1区(from,to)。多数情况下对象首先分配在eden区,在一次新生代回收后,存活下来的对象存入s0或s1区。每经过一次新生代的回收,对象的年龄加1。默认情况下年龄达到15的对象将晋升至老年代。如果在第一次回收的时候,存活的对象大于s0(s1)空间,将直接晋升至老年代,如果在为对象第一次分配空间时,对象空间大于eden空间的话,对象也直接分配到老年代。

 

 

3.java栈

Java栈和数据结构中的栈有着类似的含义,先进后出,只支持入栈和出栈操作。Java栈中保存的只要内容是栈帧,每一次进行函数调用,都会有一个对应的栈帧被压入栈中,函数调用结束,都会有一个栈帧被弹出栈。

 

 

栈帧

每一个栈帧中包含局部变量表,操作数栈和帧数据区。

栈上分配

栈上分配的基本思想,是将线程私有的对象,打散分配到栈上,分配在栈上的函数调用结束后对象会自行销毁,不需要垃圾回收接入,从而提升性能。对于大量的零散小对象,栈上分配提供了一种很好的对象分配优化策略,但由于和堆空间相比,栈空间较小,因此大对象无法也不适合在栈上分配

栈上分配依赖逃逸分析和标量替换的实现,同时必须在server模式下才能启用。参数-XX:+DoEscapeAnalysis启用逃逸分析     -XX:+EliminateAllocations开启标量替换(默认打开).

例:-server -Xms 100m -Xmx 100m -XX:+DoEscapeAnalysis -XX:+EliminateAllocations

 

 

二.Jvm常用参数

 

1.GC参数

-XX:+PrintGC    每次触发GC的时候打印相关日志

-XX:+PrintGCDetails    更详细的GC日志

-XX:+PrintHeapAtGC    每次GC时打印堆的详细详细信息

-XX:+PrintGCApplicationConcurrentTime    打印应用程序执行时间

-XX:+PrintGCApplicationAtoppedTime    打印应用程序由GC引起的停顿时间

-XX:+PrintReferenceGC    跟踪系统内的软引用,弱引用,虚引用和finallize队列。

 

 

1.类跟踪

-verbose:class    跟踪类的加载和卸载

-XX:+TraceClassLoading    单独跟踪类加载

-XX:+TraceClassUnloading    单独跟踪类卸载

-XX:+PrintClassHistogram    查看运行时类的分布情况,使用时在控制台按ctrl+break

 

 

2.系统参数查看

-XX:+PrintVMOptions       运行时,打印jvm接受的命令行显式参数

-XX:+PrintCommandLineFlags    打印传递jvm的显式和隐式参数

-XX:+PrintFlagsFinal    打印所有系统参数值

 

 

3.堆

-Xms    堆初始值

-Xmx    堆最大可用值

-Xmn    新生代大小,一般设为整个堆的1/3到1/4左右

-XX:SurvivorRatio    设置新生代中eden区和from/to空间的比例关系n/1

-XX:NewRatio    设置老年代与新生代的比

 

想要合理的分配堆内存,需要了解对象的晋升过程,可以参照上面介绍堆空间架构时,对对象晋升过程的描述。

 

 

基本策略:堆的不同分布情况,对系统会产生一定的影响。尽可能将对象预留在新生代,减少老年代GC的次数(通常老年回收起来比较慢)。实际工作中,通常将堆的初始值和最大值设置相等,这样可以减少程序运行时进行的垃圾回收次数和空间扩展,从而提高程序性能。

 

4.非堆

-XX:PermSize   方法区(永久区)初始值

-XX:MaxPermSize    方法区(永久区)最大值

-Xss    设置栈空间大小

-XX:MaxDirectMemorySize    直接内存最大可用空间,设置不当可能导致系统OOM

 

5.虚拟机工作模式

-client    默认工作模式

-server    server工作模式,启动虚拟机时需要显式指定

与client模式相比,server模式启动较慢,会尝试搜集更多的系统性能信息,使用更复杂的优化算法对程序进行优化,server模式下系统完全启动并进入稳定期后,执行速度远远快于client模式,适合长期后台运行的系统。Client模式更适合运行时间不长,又追求启动速度的客户端程序。

 

 

三.Jvm性能监控工具

1.JConsole

内存监控,线程监控,类加载情况,虚拟机信息

2.Visual VM

线程dump和分析,性能分析,内存快照分析,BTrace

3.Mission Control

MBean服务器,飞行记录器

 

四.分析java堆

1.常见的内存溢出原因及解决思路

(1)堆溢出:设置-Xmx调整最大可用堆空间

 

(2)直接内存溢出:可能是系统内存空间不足,同时没达到参数默认的上限,没有触发GC导致OOM,解决方法是通过-XX:MaxDirectMemorySize 来限制最大内存。

 

(3)过多线程导致OOM:由于每开启一个线程都会给这个线程分配一个栈,因此当线程数达到一定程度,系统空间不足的时候就会内存溢出,可以尝试减少堆空间,或者可以通过设置参数-Xss限制每个栈的大小。

 

(4)永久区溢出:系统加载的类过多,导致永久区溢出,通过-XX:MaxPermSize来设置永久区最大可用空间。

 

(5)GC效率低下引起的OOM:GC是内存回收的关键,回收效率低很有可能引起内存溢出,可以通过合理的分配堆(包括新生代和老年代)空间去解决。

 

 

2.String造成的内存泄漏

内存泄漏是指,不再使用的对象占据内存不释放,导致可用内存不断减小,最终引起内存泄漏。在Java1.6中String.subString()方法就存在这样的问题。

SubString中新生成的对象并没有从value中获取自己需要的那部分,而是直接简单的使用了相同的引用,只是修改了offset和count,以此来确定新的String对象的值。当原始字符串还在用的时候这种情况是没有问题的,并且共用value还节省了部分的空间,但是一旦原始字符串被回收,value中多余的部分就造成了空间浪费。

 

3.浅堆和深堆

浅堆:是指一个对象本身所消耗的内存,不包括其内部引用的对象的大小。

深堆:是指对象的保留集中所有对象浅堆的大小之和。

保留集:是指当对象A被垃圾回收后,可以释放的所有对象的集合(包括A本身),通俗的讲就是,仅被对象A所持有的对象的集合。

 

4.OQL查询语句

类似于sql语法的查询语句,可以在堆中进行对象的查找和筛选。

......

 

 

转载于:https://www.cnblogs.com/RUN-TIME/p/5445115.html

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

一份关于jvm内存调优及原理的学习笔记 的相关文章

  • 插入最大日期(独立于数据库)

    在我的本地设置中 我使用一个简单的 H2 数据库 托管 解决方案将有另一个 类似但不相同 数据库 我需要将最大可能日期插入到日期时间列中 我尝试使用 Instant MAX 但是 这会导致列中出现 169104626 12 11 20 08
  • 使用 JPA Criteria API 进行分页的总行数

    我正在系统中为实体实现 高级搜索 功能 以便用户可以使用该实体的属性上的多个条件 eq ne gt lt 等 来搜索该实体 我正在使用 JPA 的 Criteria API 动态生成 Criteria 查询 然后使用setFirstResu
  • 这个函数(for循环)空间复杂度是O(1)还是O(n)?

    public void check 10 for string i list Integer a hashtable get i if a gt 10 hashtable remove i 这是 O 1 还是 O n 我猜测 O n 但不是
  • OpenCV 中的 Gabor 内核参数

    我必须在我的应用程序中使用 Gabor 过滤器 但我不知道这个 OpenCV 方法参数值 我想对虹膜进行编码 启动 Gabor 过滤器并获取特征 我想对 12 组 Gabor 参数值执行此操作 然后我想计算 Hamming Dystans
  • JAVA - Xuggler - 组合 MP3 音频文件和 MP4 电影时播放视频

    使用 JAVA 和 Xuggler 以下代码组合 MP3 音频文件和 MP4 电影文件并输出组合的 mp4 文件 我希望在合并音频和视频文件时应自动播放输出视频文件 String inputVideoFilePath in mp4 Stri
  • java中如何连接字符串

    这是我的字符串连接代码 StringSecret java public class StringSecret public static void main String args String s new String abc s co
  • 按第一列排序二维数组,然后按第二列排序

    int arrs 1 100 11 22 1 11 2 12 Arrays sort arrs a b gt a 0 b 0 上面的数组已排序为 1 100 1 11 2 12 11 22 我希望它们按以下方式排序a 0 b 0 首先 如果
  • Cassandra java驱动程序协议版本和连接限制不匹配

    我使用的java驱动程序版本 2 1 4卡桑德拉版本 dsc cassandra 2 1 10cql 的输出给出以下内容 cqlsh 5 0 1 Cassandra 2 1 10 CQL spec 3 2 1 Native protocol
  • 使用 AES SecretKey 的 Java KeyStore setEntry()

    我目前正在 Java 中开发一个密钥处理类 特别是使用 KeyStore 我正在尝试使用 AES 实例生成 SecretKey 然后使用 setEntry 方法将其放入 KeyStore 中 我已经包含了代码的相关部分 The KS Obj
  • Java 文件上传速度非常慢

    我构建了一个小型服务 它从 Android 设备接收图像并将其保存到 Amazon S3 存储桶中 代码非常简单 但是速度非常慢 事情是这样的 public synchronized static Response postCommentP
  • 使用 SQLITE 按最近的纬度和经度坐标排序

    我必须获得一个 SQLite SQL 语句 以便在给定初始位置的情况下按最近的纬度和经度坐标进行排序 这是我在 sqlite 数据库中的表的例句 SELECT id name lat lng FROM items EXAMPLE RESUL
  • 在游戏视图下添加 admob

    我一直试图将 admob 放在我的游戏视图下 这是我的代码 public class HoodStarGame extends AndroidApplication Override public void onCreate Bundle
  • Java整数双除法混淆[重复]

    这个问题在这里已经有答案了 方案1 int sum 30 double avg sum 4 result is 7 0 not 7 5 VS 方案2 int sum 30 double avg sum 4 0 Prints lns 7 5
  • 欧洲中部时间 14 日 3 月 30 日星期五 00:00:00 至 日/月/年

    我尝试解析格式日期Fri Mar 30 00 00 00 CET 14至 日 月 年 这是我的代码 SimpleDateFormat formatter new SimpleDateFormat dd MM yyyy System out
  • 如何知道抛出了哪个异常

    我正在对我们的代码库进行审查 有很多这样的陈述 try doSomething catch Exception e 但我想要一种方法来知道 doSomething 抛出了哪个异常 在 doSomething 的实现中没有 throw 语句
  • 我可以创建自定义 java.* 包吗?

    我可以创建一个与预定义包同名的自己的包吗在Java中 比如java lang 如果是这样 结果会怎样 这难道不能让我访问该包的受保护的成员 如果不是 是什么阻止我这样做 No java lang被禁止 安全管理器不允许 自定义 类java
  • Eclipse 中 Spring MVC 模型对象的 (jsp /jstl) 视图中的代码辅助

    在 Spring MVC 中 当将对象放置在视图模型中时 如下所示 public String getUser Model model fetch user model addAttribute user user return viewN
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 如何从 Maven 存储库引用本机 DLL?

    如果 JAR 附带 Maven 存储库中的本机 DLL 我需要在 pom xml 中放入什么才能将该 DLL 放入打包中 更具体地举个例子Jacob http search maven org artifactdetails 7Cnet s
  • 如何在 JFreeChart 中设置多个系列的线条粗细?

    我创建了很多图表 在他们每个人中我都需要打电话 renderer setSeriesStroke i new BasicStroke 2 0f 对于每个系列 renderer is chart getXYPlot getRenderer 我

随机推荐

  • 深度学习:将新闻报道按照不同话题性质进行分类

    深度学习的广泛运用之一就是对文本按照其内容进行分类 例如对新闻报道根据其性质进行划分是常见的应用领域 在本节 我们要把路透社自1986年以来的新闻数据按照46个不同话题进行划分 网络经过训练后 它能够分析一篇新闻稿 然后按照其报道内容 将其
  • Unity学习记录——模型与动画

    Unity学习记录 模型与动画 前言 本文是中山大学软件工程学院2020级3d游戏编程与设计的作业7 编程题 智能巡逻兵 1 学习参考 除去老师在课堂上讲的内容 本次作业代码与操作主要参考了 傅老師 Unity教學 DarkSouls複刻經
  • 使用QT绘制极坐标图表

    使用QT绘制极坐标图表 在数据可视化领域 极坐标图表是非常常见的一种图表类型 QT作为一个高效 易用的GUI框架 也提供了绘制极坐标图表的功能 下面我们就来看一下如何使用QT绘制极坐标图表 首先 我们需要创建一个QT项目 选择 QT Wid
  • 数据结构与算法——第一章绪论

    数据结构与算法 绪论 数据结构的研究对象 数据结构的表示 DS的第一个重要部分 逻辑结构 DS第二个重要部分 数据的存储结构 计算机如何存储 结点及结点关系 数据结构的发展概况 抽象数据型 抽象数据型的定义 数据类型 数据结构和抽象数据型
  • 牛客网--专项训练--软件测试(待补充)

    1 集成测试分为渐增组装测试和 非渐增组装测试 渐增组装测试 是测完一个再加上一个一起测试 非渐增组装测试 是一个一个的测试 2 海伦公式求三角形面积 等价类测试用例中无效等价类意思就是无法构成三角形的 3 白盒测试是对代码内部的逻辑测试
  • Python异步请求:异步编程的常见问题

    Python异步请求 异步编程的常见问题 异步编程的常见问题 在异步编程过程中 可能会遇到一些常见的问题 了解这些问题并掌握解决方法对于开发高效的异步应用程序至关重要 异常处理 在异步编程中 异常处理变得更加关键 在同步编程中 异常通常可以
  • IDEA中设置注释模板的方法

    IDEA中设置注释模板主要分为两个部分 分别是创建java文件时类的注释和方法的注释 这里为大家详细介绍一下方法 按MyEclipse的风格设置 MyEclipse的请看 MyEclipse中设置注释模板的方法 大家可以根据自己的习惯生成自
  • [Monana] Windows/Linux/mac下Anaconda3 Python3配置Tensorflow最简明教程~(只用一步)

    Authored by MonanaHe Contact me via hemonan vip 163 com 0 写在前面的话 为什么我敢说这是最简明的教程 网上很多人用conda安装tf 而且是单独装一个tensorflow的环境 这样
  • 2023华为OD机试真题(java 100%通过)【最多获得的短信条数/动态规划】

    题目内容 某云短信厂商 为庆祝国庆 推出充值优惠活动 现在给出客户预算 和优惠售价序列 求最多可获得的短信总条数 输入描述 第一行客户预算M 其中 0 M 10 6 第二行给出售价表 P1 P2 Pn 其中 1 n 100 Pi为充值 i
  • 最全Android 开发和安全系列工具

    阿里聚安全出品 史上最全Android 开发和安全系列工具 作者 菜刀文 关注 2017 02 20 00 08 字数 4554 阅读 725 评论 1 喜欢 29 作者 阿里聚安全 地址 https zhuanlan zhihu com
  • flex布局最后一行列表左对齐的方法

    使用flex布局两端对齐 但是最后一行元素居中会很丑 所以可以让最后一行元素左对齐 方法如下 改之前 html div class list box div class item div gt div css list box displa
  • SIP 抓包后获取媒体内容备忘(解析RTP)

    SIP呼叫并抓包 从网上找免费的sip 软中端 两个转中端建立呼叫且抓包 详情可以参考 https blog csdn net liuxingrui4p article details 96709136 spm 1001 2014 3001
  • C++ 编译报错“jump to label”

    C 编译报错 jump to label 分析 解决方法 如何在Eclipse中添加编译选项 分析 void func int a 0 a goto label label int b 0 return 这样的代码是有问题的 因为C 编译规
  • Python计算机视觉编程(八)图像检索

    图像检索 BOW模型 基于BOW的图像检索 特征提取 视觉词典 TF IDF 常用参数 图像检索 具体实现流程 BOW模型 Bag of words models模型 词袋模型 词袋模型对于给定的两个文档 进行分割可以建构出一个有n个元素词
  • L2-040 哲哲打游戏 (25 分)(分析题目意思,读懂题)

    哲哲是一位硬核游戏玩家 最近一款名叫 达诺达诺 的新游戏刚刚上市 哲哲自然要快速攻略游戏 守护硬核游戏玩家的一切 为简化模型 我们不妨假设游戏有 N 个剧情点 通过游戏里不同的操作或选择可以从某个剧情点去往另外一个剧情点 此外 游戏还设置了
  • Ubuntu常用环境配置

    配置软件源 切换清华源 sudo sed i s http archive ubuntu com https mirrors tuna tsinghua edu cn g etc apt sources list sudo sed i s
  • react教程-井字棋案例扩展03

    使用两个循环来渲染出棋盘的格子 而不是在代码里写死 hardcode 这个关键点是在于循环 react的循环是和vue不一样的 veu中的循环是直接写在节点上 但是react的循环 是通过数组遍历的方法 先遍历出虚拟的Dom节点 然后通过r
  • Active Directory的基本认识

    参考文献 http edu yesky com edupxpt 379 2086379 shtml http en wikipedia org wiki Active Directory Active Directory 和我们熟悉的网络邻
  • 通讯编程002——使用Arduino ModbusTCP 控制照明

    本文介绍如何使用Arduino作为Modbus TCP从站 PC机为Modbus主站 安装ModScan用于主站调试 通过ModScan控制LED开关照明 相关软件可登录网信智汇 wangxinzhihui 下载 1 运行Arduino I
  • 一份关于jvm内存调优及原理的学习笔记

    JVM 一 虚拟机的基本结构 1 jvm整体架构 类加载子系统 负责从文件系统或者网络中加载class信息 存入方法区中 方法区 Perm 存放加载后的class信息 包括静态方法 jdk1 6以前包含了常量池 参数 XX PermSize