![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM
文章平均质量分 60
JVM
勤径苦舟
书山有路勤为径,学海无涯苦作舟。
展开
-
JVM--调优--04--案例08--元空间不够导致FULL GC
应用经常宕机。原创 2024-03-17 22:38:45 · 989 阅读 · 0 评论 -
JVM--调优--04--案例07--元空间变大导致FULL GC
占用了较大的元空间内存,同时存在内存碎片化现象,导致元空间利用率不高,从而较快达到阈值,触发 FGC。当元空间出现内存碎片化时,就要考虑是否创建了大量的类加载器。capacity和used之差较大的时候,说明碎片化严重。使用反射调用方法的时候,有个调用次数阀值(默认15次)通过进一步分析,发现是由于反射导致创建大量。通过 dump 堆存储文件发现存在大量。反射调用导致创建大量。原创 2024-03-17 18:07:24 · 566 阅读 · 0 评论 -
JVM--调优--02--调优指标
每次YGC耗时在100ms以内,50ms以内尤佳。每分钟的GC耗时在1s以内,500ms以内尤佳。每次FGC耗时在1s以内,500ms以内尤佳。FGC最多几小时1次,1天不到1次尤佳。原创 2024-03-17 17:26:12 · 416 阅读 · 0 评论 -
JVM--调优--04--案例06--元空间变大导致频繁YGC
频繁YGC。原创 2024-03-16 19:43:50 · 382 阅读 · 0 评论 -
JVM--调优--04--案例05--SWAP导致的Full GC时间长
当系统运行一段时间,放到内存的对象变多,且有些对象是暂时没有用,持续一段时间后,发现内存不够了,这个时候SWAP会将。由于SWAP位于磁盘上,读写数据的速度相比物理内存会慢得多,因此过度使用SWAP可能导致系统性能下降。因此,SWAP实际上扩大了系统的可用内存,使得即使在存不足的情况下,也能运行大内存的应用程序。所以每次Full GC,CPU和内存都会升高,SWAP会降低。当物理内存不足时,SWAP 会将内存中暂时不用的数据 放到。当发生FULL GC的时候,需要分析所有对象,这个时候会把。原创 2024-03-16 19:23:37 · 531 阅读 · 0 评论 -
JVM--基础--27.5--工具--MemoryAnalyzer--使用
我们排查内存泄露问题可以主要看app_Leak_Suspects.zip 这个压缩包下的内容。分析完成后会生成三个zip包,原创 2023-07-21 18:08:44 · 234 阅读 · 1 评论 -
JVM--基础--27.4--工具--MemoryAnalyzer--介绍、安装
MemoryAnalyzer.ini配置文件上默认的堆内存大小是1024m,需要修改成比dump文件大小大一些,我们这边设置为-Xmx6144m。我通过jmap命令生成dump文件(4G),非常大,使用VisualVM不能很好分析dump文件,所以使用Memory Analyzer进行分析。根据jdk版本下载合适的mat版本,我使用的是jdk1.8,x86_64,所以下载的是图示的版本。原创 2023-07-21 18:07:52 · 2127 阅读 · 0 评论 -
JVM--基础--30--hs_err_pid
日志头文件包含概要信息,简述了导致 崩溃 的原因。导致 崩溃 的原因很多,常见的原因有jvm自身的bug,应用程序错误,jvm参数配置不当,服务器资源不足,jni调用错误等。原创 2023-03-11 16:19:10 · 2548 阅读 · 0 评论 -
JVM--基础--19.4--垃圾收集器--G1
。原创 2022-12-19 10:05:40 · 880 阅读 · 0 评论 -
JVM--基础--24.2--日志参数
jvm原创 2022-11-14 13:30:56 · 701 阅读 · 0 评论 -
JVM--调优--04--案例02--大SQL导致内存溢出
JVM–调优–04–案例–大SQL导致内存溢出1、现象项目启动,且没有人使用,一段时间后就报redis连接异常。1.1、日志信息 org.redisson.client.RedisTimeoutException: Command execution timeout for command: (SENTINEL GET-MASTER-ADDR-BY-NAME), params: [crc-redis-sentinel], Redis client: [addr=redis://xxx:26380原创 2022-03-22 10:00:37 · 7562 阅读 · 0 评论 -
JVM--调优--04--案例01--生产oom分析案例
JVM–调优–04–案例–生产oom分析案例1、问题描述项目首页,匿名无登陆,对首页进行150个线程,8小时压测,可以看到老年代一直在增加(visual gc),到某一时刻,直接oom,堆空间的图不是矩形。2、解决方案(堆dump文件分析)2.1、加载dump文件2.2、分析自己写的实体双击进去2.3、点击属性中,非基本类型的,且是自己写的实体属性(CmsUserSite)2.4、结论说明CmsUserSite循环引用(a–>b–>a),循环引用造成内存原创 2022-03-22 10:00:22 · 370 阅读 · 0 评论 -
JVM--调优--3.2--参数--开发配置
JVM–调优–03–开发配置1、本地配置-Xmx1g -Xms1g -Xmn900m -XX:+UseG1GC -Xloggc:gc.log -XX:+PrintGCDetails2、linux tomcat 配置进入tomcat的bin目录修改catalina.sh文件 if [ -z "$JSSE_OPTS" ] ; then JSSE_OPTS="-Djdk.tls.ephemeralDHKeySize=2048" fi JAVA_OPTS="$JAVA_原创 2022-03-22 10:00:08 · 660 阅读 · 0 评论 -
JVM--调优--3.1--参数--重要参数设置
JVM–调优–02–重要参数设置1、设置最小堆和最大堆一样原因空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制,空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx 相等以避免在每次GC后调整堆的大小。操作(本机以idea作为操作)-Xms1024m-Xmx1024m2、设置收集器为g1收集器-XX:+UseG1GC2.1、好处并行性回收期间,可以由多个GC线程同时工作,有效的利用多核的计算能力并发性原创 2022-03-22 09:59:51 · 1597 阅读 · 0 评论 -
JVM--调优--01--常用命令
JVM–调优–01–常用命令1、查对应的进程: jps -l2、查看设置过值的参数:jinfo -flags pid3、查看初始堆内存:jinfo -flag InitialHeapSize pid4、查看最大堆内存:jinfo -flag MaxHeapSize pid5、查看永久代:jinfo -flag PermSize pid6、查看最大永久代:jinfo -flag MaxPermSize pid7、查看年轻代初始内存:jinfo -flag NewSize pid原创 2022-03-21 17:53:10 · 391 阅读 · 0 评论 -
JVM--基础--28--待学的好文章
JVM–基础–30–待学的好文章https://blog.csdn.net/Open_Coder/article/details/119569424https://blog.csdn.net/augsm/article/details/109272205https://blog.csdn.net/yang_net/article/details/5830820原创 2022-03-21 17:52:28 · 74 阅读 · 0 评论 -
JVM--基础--27.3--工具--VisualVM--使用
JVM–基础–27.3–工具–VisualVM–使用测试代码public class Demo2 { private static final int _1MB = 1 * 1024 * 1024; public static void main(String[] args) throws InterruptedException { int size = 1000 * 10000; int time = 1000; byte[] a1原创 2022-03-21 17:51:37 · 214 阅读 · 0 评论 -
JVM--基础--27.2--工具--VisualVM--远程连接
JVM–基础–27.2–工具–VisualVM–远程连接1、准备工作准备工作是为了测试使用1.1、代码地址https://gitee.com/DanShenGuiZu/learnDemo/tree/master/visualvm-learn/demo11.2、将jar包放到机器上2、远程连接–JMX方式2.1、修改JDK配置文件# 进入修改目录cd /usr/local/jdk1.8/jre/lib/management# 拷贝配置文件cp jmxremote.password原创 2022-03-20 20:22:35 · 3887 阅读 · 0 评论 -
JVM--基础--27.1--工具--VisualVM--安装
JVM–基础–27.1–工具–VisualVM–安装1、介绍是一个监控工具jdk自带有这个工具1.1、jdk自带有这个工具2、自己安装VisualVM2.1、下载https://visualvm.github.io/2.2、启动原创 2022-03-20 20:21:32 · 120 阅读 · 0 评论 -
JVM--基础--26.7--工具--jconsole
JVM–基础–26.7–工具–jconsole1、工具位置2、测试2.1、代码package com.fei.zhou.day1;import java.util.ArrayList;import java.util.List;public class JConSoleTest { JConSoleTest() { // 创建构造对象都要分配128Kb的内存给数组 // bis局部变量,垃圾回收会定时回收 byte[] bis = new byte[128 * 10原创 2022-03-20 20:21:03 · 165 阅读 · 0 评论 -
JVM--基础--26.6--工具--jstack
JVM–基础–26.6–工具–jstack1、介绍用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和n原创 2022-03-20 20:20:44 · 168 阅读 · 0 评论 -
JVM--基础--26.5--工具--jhat
JVM–基础–26.5–工具–jhat1、介绍分析jmap生成的dumpjhat内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,可以在浏览器中查看。注意:一般不会直接在服务器上进行分析,因为jhat是一个耗时并且耗费硬件资源的过程,一般把服务器生成的dump文件复制到本地或其他机器上进行分析。2、测试jhat C:\Users\Administrator\Desktop\test\dump.hprof...原创 2022-03-20 20:20:28 · 664 阅读 · 0 评论 -
JVM--基础--26.4--工具--jmap
JVM–基础–26.4–工具–jmap1、介绍用于生成heap dump文件,如果不使用这个命令,还可以使用-XX:+HeapDumpOnOutOfMemoryError参数来让虚拟机出现OOM的时候,自动生成dump文件。查询finalize执行队列、Java堆和永久代的详细信息,如当前使用率、当前使用的是哪种收集器等。2、语法2.1、格式jmap [option] pid2.2、参数说明2.2.1、optiondump : 生成堆转储快照finalizerinfo : 显原创 2022-03-20 20:20:12 · 267 阅读 · 0 评论 -
JVM--基础--26.3--工具--jinfo
JVM–基础–26.3–工具–jinfo1、介绍查看运行中jvm的全部参数,还可以设置部分参数。2、语法2.1、格式jinfo [ option ] pidjinfo [ option ] executable corejinfo [ option ] [server-id@]remote-hostname-or-IP2.2、参数说明2.2.1、optionno option 输出全部的参数和系统属性-flag name 输出对应名称的参数-flag [+|-]nam原创 2022-03-20 20:19:48 · 146 阅读 · 0 评论 -
JVM--基础--26.2--工具--jstat
JVM–基础–26.2–工具–jstat1、介绍对java应用程序的资源和性能进行实时的监控。2、语法2.1、格式jstat <option> [-t] [-h] <pid> <interval> <count>2.2、参数说明2.2.1、option-class 显示ClassLoad的相关信息;-compiler 显示JIT编译的相关信息;-gc 显示和gc相关的堆信息;-gccapacity 显示原创 2022-03-20 20:19:31 · 163 阅读 · 0 评论 -
JVM--基础--26.1--工具--jps
JVM–基础–26.1–工具–jps1、介绍查看所有的jvm进程,包括进程ID,进程启动的路径等等。2、语法2.1、格式jps [ options ] [ hostid ]2.2、参数说明2.2.1、options-q 只输出java进程的进程id-l 输出java进程的进程id和main方法的类全名-m 输出java进程的进程id和main方法的入参-v 输出java进程的进程id和jvm的入参-V 输出java进程的进程id和通过flag文件传入jvm的参数2原创 2022-03-20 20:19:14 · 121 阅读 · 0 评论 -
JVM--基础--25--JDK7和JDK8的JVM内存模型
JVM–基础–25–JDK7和JDK8的JVM内存模型1、JDK8内存模型2、JDK7内存模型3、1.3到1.8运行时常量池变化4、JDK7和JDK8的最大区别4.1、方法区变化元数据区取代了永久代,就是JDK8没有了PermSize相关的参数配置了。元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元数据空间并不在虚拟机中,而是使用本地内存。4.2、为什么废除永久代官方文档:移除永久代是为融合HotSpot JVM与 JRo原创 2022-03-20 20:18:40 · 562 阅读 · 0 评论 -
JVM--基础--24.1--参数
JVM–基础–24–参数1、常用参数1.1、-Xms初始堆大小默认值:物理内存的1/64(<1GB)默认空余堆内存小于40%时,JVM就会增大堆,直到-Xmx的最大限制。可以通过MinHeapFreeRatio参数可以调整1.2、-Xms最大堆大小默认值:物理内存的1/4(<1GB)默认空余堆内存大于70%时,JVM会减少堆,直到-Xms的最小限制可以通过MaxHeapFreeRatio参数可以调整1.3、-Xmn年轻代大小(1.4o原创 2022-03-18 13:26:35 · 711 阅读 · 0 评论 -
JVM--基础--23--类加载器,双亲委派模型
JVM–基础–23–类加载器,双亲委派模型1、类加载器1.1、定义就是根据指定的全限定名称将class文件加载到JVM内存,转为Class对象。1.2、类型1.2.1、启动类加载器(Bootstrap ClassLoader)1. 由C++语言实现(针对HotSpot)2. 负责将指定的类库加载到内存中。 1. <JAVA_HOME>\lib目录的类 2. -Xbootclasspath参数指定的路径中的类1.2.2、扩展类加载器(Extension ClassL原创 2022-03-18 13:25:56 · 95 阅读 · 0 评论 -
JVM--基础--22--字节码指令
JVM–基础–22–字节码指令1、字节码简介Java字节码由操作码和操作数组成。操作码:1个字节长度,代表某种特定操作含义的数字操作数:零至多个代表此操作码所需参数2、字节码与数据类型在字节码指令集中,大多数指令都有操作所对应的数据类型信息,比如iload表示从局部变量表中加载int型的数据到操作栈中.除了long和double类型外,每个变量都占局部变量区中的一个变量槽(slot),而long及double会占用两个连续的变量槽。大多数对于boolean、byte、sh原创 2022-03-18 13:25:24 · 979 阅读 · 0 评论 -
JVM--基础--21--对象的内存布局
JVM–基础–21–对象的内存布局1、普通对象实例与数组对象实例的数据结构图2、在HotSpot虚拟机中,对象在内存中存储的布局如下2.1、对象头(Header)2.1.1、markword用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等这部分数据的长度在32位和64位的虚拟机(未开启压缩指针)中分别为32bit和64bit。2.1.2、klass对象指向它的类元数据的指针,虚拟机通过这个原创 2022-03-18 13:24:58 · 1057 阅读 · 0 评论 -
JVM--基础--20--对象的创建过程
JVM–基础–20–对象的创建过程1、对象的创建过程讨论的对象限于普通Java对象,不包括数组和Class对象等。虚拟机遇到一条new指令时:过程如下1.1、类加载当虚拟机遇到一条new指令时 ,首先去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化过,如果没有,那必须先执行相应的类加载过程。1.2、内存分配当已经执行过类加载过程后,会为新对象在Java堆中分配一块大小已经确定(类加载后确定)的内存,具体的内存分配原创 2022-03-18 13:24:08 · 202 阅读 · 0 评论 -
JVM--基础--19.3--垃圾收集器--CMS
JVM–基础–19.6–垃圾收集器–CMS1、结构图2、CMS(Concurrent Mark Sweep)收集器2.1、特征一种以获取最短回收停顿时间为目标的收集器。适用于 :重视服务的响应速度,希望系统停顿时间最短,以给用户带来较好的体验的应用。CMS收集器是基于"标记-清除"算法实现的2.2、运作过程分为4个步骤2.2.1、初始标记(CMS initial mark)需要"Stop The World",仅仅只是标记一下GC Roots能直接关联到的对象,速度很快。原创 2022-03-18 13:23:05 · 307 阅读 · 0 评论 -
JVM--基础--19.2--垃圾收集器--Parallel Scavenge,Parallel Old
JVM–基础–19.5–垃圾收集器–Parallel Old1、结构图2、Parallel Old 收集器2.1、特征是Parallel Scavenge收集器的老年代版本,使用多线程和"标记-整理"算法。参数控制: -XX:+UseParallelOldGC只能和Parallel Scavenge配合使用,这个组合常用于注重吞吐量以及CPU资源敏感的场合。2.2、Parallel Scavenge/Parallel Old运行原创 2022-03-18 13:21:47 · 486 阅读 · 0 评论 -
JVM--基础--19.5--垃圾收集器--G1参数
JVM–基础–19.3–垃圾收集器–ParNew1、结构图2、ParNew 收集器2.1、特征1. 其实就是Serial收集器的多线程版本,除了使用多条线程进行垃圾收集之外,其余的和Serial所有控制参数一样。2. 在配置为CMS 收集器的默认新生代收集器。3. 在多CPU的环境下可以发挥更高而效率,并且是唯一一个可以和CMS收集器搭配工作的新生代并行GC。4. 单CPU的环境下效率低于Serial5. 适用:运行在server模式下的虚拟机首选的新生代收集器。6. 使用方法原创 2024-03-11 22:25:04 · 1859 阅读 · 0 评论 -
JVM--基础--19.1--垃圾收集器--Seiral,Serial Old,ParNew
JVM–基础–19.1–垃圾收集器–Seiral1、结构图2、Seiral 收集器2.1、特征1. 是单线程的2. 在垃圾回收时,必须暂停其他所有线程的工作线程,即所谓的"Stop The World"3. jvm在Client模式下,默认的新生代收集器仍然是Serial收集器,虽然它有着上述两个重大的缺点,但也有这简单高效的优点。 1. 单线程,没有线程交互开销4. 使用方法:-XX:+UseSerialGC5. 适用:运行在Client模式下的虚拟机。 2.原创 2022-03-17 07:56:03 · 704 阅读 · 0 评论 -
JVM--基础--18--class文件解析
JVM–基础–18–class文件解析1、前提1.1、测试的代碼public class Hello{ private int test; public int test(){ return test; }}1.2、对应的二进制代码CA FE BA BE 00 00 00 34 00 12 0A 00 04 00 0E 09 00 03 00 0F 07 00 10 07 00 11 01 00 04 74 65 73 74 01 00 01原创 2022-03-17 07:55:01 · 361 阅读 · 0 评论 -
JVM--基础--17--方法调用:解析与分派
JVM–基础–17–方法调用中的解析与分派1、方法调用方法调用并不等于方法的执行方法调用阶段唯一的任务就是确定被调用方法的版本(考虑多态情况)。2、解析所有的方法调用中的目标方法在Class文件中都是一个常量池中的符号引用,在类加载的解析阶段,会将其中的一部分引用转化为直接引用,这种解析的前提是:方法在程序真正运行之前就有一个可确定的调用版本,并且这个方法的调用版本在运行期间是不变的。换句话说,调用方法在编译器进行编译时就必须确定下来。2.1、这类方法主要包括:静态方法:与类直接关原创 2022-03-17 07:53:34 · 485 阅读 · 0 评论 -
JVM--基础--16--栈帧结构
JVM–基础–16–运行时栈帧结构1、栈帧组成部分1. 局部变量表2. 操作数栈3. 动态连接4. 方法返回地址和一些额外的附加信息。在编译代码的时候,栈帧中需要多大的局部变量表,多深的操作数栈都已经完全确定了,并且写入到了方法表的Code属性中,因此一个栈帧需要分配多少内存,不会受到程序运行期变量数据的影响,而仅仅取决于具体虚拟机的实现。一个线程中的方法调用链可能会很长,很多方法都同时处理执行状态。对于执行引擎来讲,活动线程中,只有虚拟机栈顶的栈帧才是有效的,称为当前栈帧(Curre原创 2022-03-17 07:53:02 · 405 阅读 · 0 评论 -
JVM--基础--15--JVM对象的访问定位
JVM–基础–15–JVM对象的访问定位1、主流的访问方式有两种使用句柄访问使用直接指针访问2、使用句柄访问Java堆中将会划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址句柄中包含了对象实例数据与类型数据的具体各自的地址信息。2.1、句柄来访问的最大好处就是reference中存储的是稳定句柄地址,在对象被移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针,而reference本身不需要被修改。3、使用直接指针访问Jav原创 2022-03-17 07:52:31 · 518 阅读 · 0 评论