JVM
文章平均质量分 76
JVM
张俊杰1994
平平淡淡的码农一个。
展开
-
Eclipse的MAT的支配树
学习 尚硅谷 宋红康 JVM从入门到精通 的学习笔记。原创 2022-08-14 17:58:54 · 381 阅读 · 0 评论 -
Eclipse-MAT 案例:Tomcat堆溢出分析
学习 尚硅谷 宋红康 JVM从入门到精通 的学习笔记。原创 2022-08-14 17:57:36 · 624 阅读 · 0 评论 -
Eclipse-MAT的使用案例
打开hprof文件后点击下面图片的图标来查看线程概述能看到main方法方法里面3个Student对象,三个student的shallow heap(浅堆)大小都是24, 但是三个对象的retained heap (深堆)都是不一样的.第一个student对象如果被回收的话,就会回收3784个字节第二个student对象如果被回收的话,就会回收1872个字节第三个student对象如果被回收的话,就会回收1384个字节。...原创 2022-08-14 17:55:56 · 508 阅读 · 0 评论 -
Eclipse-MAT的插件介绍使用
leak suspects report 泄露的疑点报告这个是mat会自动的检测dump文件,用于查看哪些是泄露的疑点,报告中会说明哪些对象还在存活,以及为什么没有被垃圾回收器收集.内存泄露的问题非常关注这个,因为内存泄露就是对象不用了,但是为什么不能被垃圾回收器回收.Component Report 组件的报告会分析对象的集合,找到相关的可疑的内存空间,比如说重复的字符串,空的集合容器,弱引用等等,这些都是我们认为可疑的内存。.........原创 2022-08-14 17:53:45 · 5558 阅读 · 0 评论 -
内存泄露详细介绍
可达性分析算法来判断对象是否是不再使用的对象,本质都是判断一个对象是否还被引用.那么对于这种情况下,由于代码的实现不同就会出现多种内存泄露的问题(让JVM误以为这个对象还在引用中,无法回收,造成了内存的泄露)是否还被使用?是是否还被需要?是是否还被使用?是是否还被需要?不需要。...原创 2022-08-07 16:37:34 · 2397 阅读 · 0 评论 -
JVM调优前置知识-深堆Retained Heap和浅堆Shallow Heap
学习尚硅谷宋红康JVM从入门到精通的学习笔记深堆RetainedHeap和浅堆ShallowHeap浅堆的大小不会超过深堆,顶多是平等浅堆算是对应Java的浅拷贝,深堆算是对应Java的深拷贝。原创 2022-07-30 16:29:13 · 1075 阅读 · 0 评论 -
JVM监控及诊断工具之Visual VM
Visual VM 是一个功能强大的多合一(多种功能)的故障诊断和性能检测的可视化工具。它集成了多个jdk命令行工具,使用了Visual VM可用于显示虚拟机进程(jps)及进程的配置和环境信息(jps,jinfo),监视应用程序的CPU、GC、堆、方法区及线程的信息(jstat、jstack)等,甚至代替了JConsole 。在jdk 6 更新到7以后,Visual VM作为JDK的一部分发布(VisualVM在 JDK/bin目录下),Visual VM是完全免费的,可以完全替代jConsole,建原创 2022-07-09 19:11:00 · 1226 阅读 · 0 评论 -
JVM监控及诊断工具之JConsole
从jdk5开始,在jdk中自带的Java监控和管理控制台.用于对jvm中的内存(内存分的展示的也比较细致)、线程(线程有多少个)和类(加载了多少个类)等监控,建议直接跳过JConsole,直接学习Visual VM ,毕竟这两个都是jdk自带的。两种启动方式:1.在jdk安装目录中找到jconsole.exe,双击该可执行文件就可以连接方式Local注意:本地连接要求 启动jconsole的用户 和 运行当前程序的用户 是同一个用户具体操作如下:1、在DOS窗口中输入jconsole2、在原创 2022-07-09 19:09:17 · 716 阅读 · 0 评论 -
JVM监控及诊断工具-GUI
使用jdk命令行工具可以获取目标Java应用性能相关的基础信息,但是存在一些局限性:1.无法获取方法级别的分析数据,比如说方法之间的调用关系,各个方法的调用次数和调用时间等等(这个对定位应用性能瓶颈至关重要).2.要求用户登录到目标Java应用所在的宿主机上,使用起来也不是很方便3.分析数据通过终端输出(黑窗口输出),结果展示不够直观(黑窗口显示的内容看起来有点麻烦)为此jdk提供了一些内存泄露的分析工具,比如说jconsole,jvisualvm等等。用来辅助开发人员定位问题,但是这些工具很多时候并原创 2022-07-09 19:06:32 · 268 阅读 · 0 评论 -
JVM命令之 jstat:查看JVM统计信息
其中vmid是进程id号,也就是jps之后看到的前面的号码,如下:option参数-gc新生代相关S0C是第一个幸存者区的大小(字节)S1C是第二个幸存者区的大小(字节)S0U是第一个幸存者区已使用的大小(字节)S1U是第二个幸存者区已使用的大小(字节)EC是Eden空间的大小(字节)EU是Eden空间已使用大小(字节)老年代相关OC是老年代的大小(字节)OU是老年代已使用的大小(字节)方法区(元空间)相关MC是方法区的大小MU是方法区已使用的大小CCSC是压缩类空间的大小原创 2022-07-09 19:05:30 · 1506 阅读 · 0 评论 -
JVM命令之 jstat:查看JVM统计信息
其中vmid是进程id号,也就是jps之后看到的前面的号码,如下:option参数-gc新生代相关S0C是第一个幸存者区的大小(字节)S1C是第二个幸存者区的大小(字节)S0U是第一个幸存者区已使用的大小(字节)S1U是第二个幸存者区已使用的大小(字节)EC是Eden空间的大小(字节)EU是Eden空间已使用大小(字节)老年代相关OC是老年代的大小(字节)OU是老年代已使用的大小(字节)方法区(元空间)相关MC是方法区的大小MU是方法区已使用的大小CCSC是压缩类空间的大小原创 2022-07-02 22:04:17 · 1662 阅读 · 0 评论 -
JVM命令之 jstack:打印JVM中线程快照
jstack(JVM Stack Trace)是用于生成虚拟机指定进程当前时刻的线程快照(虚拟机堆栈跟踪),线程快照就是当前虚拟机内指定进程的每一条线程正在执行的方法堆栈的集合.生成线程的快照的作用: 多线程在执行过程中可能会出现长时间停顿的问题,线程争抢资源的时候有的线程就需要等待同步监视器或者死锁,或者死循环,等等以上情况都会导致线程不正常的情况, 会出现长时间的停顿,要想知道是哪段代码导致的线程停顿的,这个时候就需要jstack指令了基本语法option参数:-F当正常输出的请求不被响应时,强制原创 2022-07-02 22:03:17 · 2501 阅读 · 0 评论 -
JVM命令之 jps:查看正在运行的Java进程
jps是 java process status 的缩写,翻译过来是"Java的进程的状态"意思是显示指定系统内所有的HotSpot虚拟机进程(查看虚拟机的进程信息),可以用于查询正在运行的虚拟机进程.说明: 对于本地虚拟机进程来说,进程 的本地虚拟机ID与操作系统的进程ID是一致的,是唯一的.以后监控jvm的话,你需要先知道是哪个进程,就需要用jps指令查看进程启动上面的Java程序,再执行jps查看6328就是ScannerTest的进程,14604是Jps,因为Jps本身也是一个Java进程原创 2022-07-02 22:01:09 · 861 阅读 · 0 评论 -
JVM命令之 jps:查看正在运行的Java进程
jps是 java process status 的缩写,翻译过来是"Java的进程的状态"意思是显示指定系统内所有的HotSpot虚拟机进程(查看虚拟机的进程信息),可以用于查询正在运行的虚拟机进程.说明: 对于本地虚拟机进程来说,进程 的本地虚拟机ID与操作系统的进程ID是一致的,是唯一的.以后监控jvm的话,你需要先知道是哪个进程,就需要用jps指令查看进程启动上面的Java程序,再执行jps查看6328就是ScannerTest的进程,14604是Jps,因为Jps本身也是一个Java进程原创 2022-07-02 22:00:26 · 1226 阅读 · 0 评论 -
JVM命令之- jmap:导出内存映像文件&内存使用情况
jmap全称 JVM Memory Map.作用之一是获取dump文件(堆转储快照文件,二进制文件),还可以获取目标Java进程的内存相关信息,包括Java堆各区域的使用情况、堆中对象的统计信息,类加载信息等等。dump文件(堆转储快照文件,二进制文件)是当前时刻内存中的一些对象一些数据占用内存的大小的记录这样的情况,是一个二进制的文件,需要用专门的工具来打开。1.使用语法可以通过在DOS窗口中使用jmap/jmap -h/jmap -help查看2. ...原创 2022-07-02 21:59:21 · 3582 阅读 · 0 评论 -
JVM命令之 jinfo:实时查看和修改JVM配置参数
jinfo全拼是 Configuration Info for Java作用是查看虚拟机配置参数信息,也可以用于调整虚拟机的配置参数。在很多情况下,Java应用程序不会指定所有的Java虚拟机参数,毕竟虚拟机参数太多了,开发人员可能不知道某个Java虚拟机的参数设置的默认值到底是多少,比如说我想看一下默认的新生代老年代比例分配是多少等等。这个时候如果开发人员去查找开发文档的话,可能就比较麻烦了,但是使用jinfo工具,开发人员就能很快的查看到某个虚拟机配置的参数。查看jinfo -sysprops 进原创 2022-07-02 21:58:20 · 1432 阅读 · 0 评论 -
jvm命令之 jcmd:多功能命令行
在jdk1.7以后,新增了这个命令行工具,jcmd,这个工具就像一个瑞士军刀一样,集成了jstat之外所有命令的功能,比如说用jcmd命令来导出堆、内存使用、查看Java进程、导出线程信息、执行GC、JVM运行时间等等。jcmd有jmap的大部分功能,并且在Oracle的官方网上上也推荐使用jcmd命名代替jmap命令。列出所有的JVM进程上面的操作就和jsp很像了针对指定的进程,有哪些命令可以使用的显示指定进程的指令命令的数据根据以上命令来替换之前的那些操作:Thread.print 可以替换 js原创 2022-07-02 21:57:18 · 691 阅读 · 0 评论 -
JVM监控及诊断工具-命令行篇
性能诊断是软件工程师在日常工作中需要经常面对和解决的问题,在用户体验至上的今天,解决好应用的性能问题能带来非常大的收益.Java作为最流行的编程语言之一,其应用性能诊断一直受到业界广泛关注.可能造成Java应用出现性能问题的因素非常的多,列如线程控制、磁盘读写、数据库访问、网络I/O、垃圾收集等等。想要定位这些问题,一款优秀的性能诊断工具必不可少。Java的使用量比较大,Java主要是做后台的,我们各种终端,比如说浏览器,app等等,都会集中访问后台,这个是存在一个高并发的场景的,这个高并发的场景下就需原创 2022-07-02 21:54:40 · 304 阅读 · 0 评论 -
JVM调优的前置知识
生产环境发生了内存溢出该如何处理生产环境应该给服务器分配多少内存合适?如何对垃圾回收器的性能进行调优?生产环境CPU负载飙高该如何处理?生产环境应该给应用分配多少线程合适?不加log,如何确定请求是否执行了某一行代码?不加log,如何实时查看某个方法的入参与返回值?1.防止出现OOM:一出现oom程序就宕机了,所以要防止出现oom2.解决OOM:出现oom要解决oom3.减少Full GC出现的频率:Full GC不可能不出现,要尽量减少Full GC频率,因为Full GC会出现stop原创 2022-06-11 12:59:59 · 217 阅读 · 1 评论 -
JVM七种垃圾回收器
什么是垃圾回收器如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。虽然我们对各个收集器进行比较,但并非要挑选出一个最好的收集器。因为直到现在为止还没有最好的垃圾收集器出现,更加没有万能的垃圾收集器,我们能做的就是根据具体应用场景选择适合自己的垃圾收集器。试想一下:如果有一种四海之内、任何场景下都适用的完美收集器存在,那么我们的 HotSpot 虚拟机就不会实现那么多不同的垃圾收集器了。在JVM中间一般来说垃圾回收器不单单是一个算法,也就是说在JVM垃圾回收器中可能多种算法都有用到原创 2021-04-07 20:07:19 · 1470 阅读 · 1 评论 -
JVM垃圾回收算法
(一)垃圾回收算法新生代基本都会采用复制算法老年代一般会采用标记清除算法和标记整理算法1.对象内存分配流程图2.复制算法(Copying)将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。这样使得每次都是对整个半区进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况,只要按顺序分配内存即可,实现简单,运行高效。只是这种算法的代价是将内存缩小为了原来的一半。注意:内存移动是必须实打实的原创 2021-04-07 20:04:35 · 140 阅读 · 0 评论 -
JVM类加载器和双亲委派模型
在介绍双亲委派模型之前先说下类加载器。对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立在 JVM 中的唯一性,每一个类加载器,都有一个独立的类名称空间。类加载器就是根据指定全限定名称将 class 文件加载到 JVM 内存,然后再转化为 class 对象。类加载器分类启动类加载器BootstrapClassLoader,启动类加载器主要加载的是JVM自身需要的类,这个类加载使用C++语言实现的,是虚拟机自身的一部分,负责加载存放在 JDK\jre\lib(JDK代表原创 2021-04-07 19:58:37 · 147 阅读 · 0 评论 -
JVM类加载的几个过程
这是类加载的过程,加载的类是放到了 JVM 的元数据空间,也就是永久代。• 加载:根据查找路径找到相应的 class 文件然后导入;• 检查:检查加载的 class 文件的正确性;• 准备:给类中的静态变量分配内存空间;• 解析:虚拟机将常量池中的符号引用替换成直接引用的过程。符号引用就理解为一个标示,而在直接引用直接指向内存中的地址;• 初始化:对静态变量和静态代码块执行初始化工作。概述通过全限定名来加载生成 class 对象到内存中,然后进行验证这个 class 文件,包括文件格式校验、原创 2021-04-07 19:56:20 · 251 阅读 · 0 评论 -
JVM类加载机制
概念虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验,解析和初始化,最终形成可以被虚拟机直接使用的 java 类型,这就是类加载机制.类加载器把class文件中的二进制数据读入到内存中,存放在方法区,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类加载的几个过程https://www.yuque.com/docs/share/5cc4ef4a-0769-4f0d-ba3e-16dd30405147?# 《JVM类加载的几个过程》特点:1原创 2021-04-07 19:55:32 · 128 阅读 · 0 评论 -
JVM类加载的几个过程
这是类加载的过程,加载的类是放到了JVM的元数据空间,也就是永久代。• 加载:根据查找路径找到相应的 class 文件然后导入;• 检查:检查加载的 class 文件的正确性;• 准备:给类中的静态变量分配内存空间;• 解析:虚拟机将常量池中的符号引用替换成直接引用的过程。符号引用就理解为一个标示,而在直接引用直接指向内存中的地址;• 初始化:对静态变量和静态代码块执行初始化工作。概述通过全限定名来加载生成 class 对象到内存中,然后进行验证这个 class 文件,包括文件格式校验、元原创 2021-03-29 10:17:40 · 165 阅读 · 0 评论 -
Java虚拟机内存结构
Java虚拟机内存结构不同虚拟机的运行时数据区可能略微有所不同,但都会遵从 Java 虚拟机规范, Java 虚拟机规范规定的区域分为以下 5 个部分:方法区 程序计数器 虚拟机栈 本地方法栈 堆各个区的作用程序计数器指向当前线程正在执行的字节码指令。线程私有的。内存空间小,该内存区域是唯一一个java虚拟机规范没有规定任何OOM情况的区域。一个线程的执行,是通过字节码解释器改变当前线程的计数器的值,来获取下一条需要执行的字节码指令,从而确保线程的正确执行。为什么需要程序计数器 ?参考:h原创 2021-03-28 17:58:16 · 161 阅读 · 0 评论 -
基本数据类型保存在java虚拟机的哪个部分?
有两种情况1.方法内定义2.方法外定义(类中定义)方法内定义在方法中声明的变量,即该变量是局部变量,每当程序调用方法时,系统都会为该方法建立一个方法栈,其所在方法中声明的变量就放在方法栈中,当方法结束系统会释放方法栈,其对应在该方法中声明的变量随着栈的销毁而结束,这就局部变量只能在方法中有效的原因在方法中声明的变量可以是基本类型的变量,也可以是引用类型的变量。1.当声明是基本类型的变量的时,其变量名及值(变量名及值是两个概念)是放在JAVA虚拟机栈中2.当声明的是引用变量时,所声明的变量(该变原创 2021-03-17 18:36:53 · 448 阅读 · 0 评论 -
[jvm]常见OOM情况*
1.Java堆内存溢出,此种情况最常见,一般由于内存泄露或者堆的大小设置不当引起。对于内存泄露,需要通过内存监控软件查找程序中的泄露代码,而堆大小可以通过虚拟机参数-Xms,-Xmx等修改。2.Java永久代溢出,即方法区溢出了,一般出现于大量Class或者jsp页面,或者采用cglib等反射机制的情况,因为上述情况会产生大量的Class信息存储于方法区。此种情况可以通过更改方法区的大小来解决,使用类似-XX:PermSize=64m -XX:MaxPermSize=256m的形式修改。另外,过多的常量尤原创 2020-10-29 17:53:01 · 311 阅读 · 0 评论 -
[jvm]Java SE体系架构*
Java SE体系架构JavaSE,Java平台标准版,为Java EE和Java ME提供了基础。JDK:Java开发工具包,JDK是JRE的超集,包含JRE中的所有内容,以及开发程序所需的编译器和调试程序等工具。JRE:Java SE运行时环境 ,提供库、Java虚拟机和其他组件来运行用Java编程语言编写的程序。主要类库,包括:程序部署发布、用户界面工具类、继承库、其他基础库,语言和工具基础库JVM:java虚拟机,负责JavaSE平台的硬件和操作系统无关性、编译执行代码(字节码)和平台安全性原创 2020-10-29 17:52:36 · 334 阅读 · 0 评论 -
[jvm]JVM的主要部件*
概述JVM包含两个子系统和两个组件,两个子系统为Class loader(类装载)、Execution engine(执行引擎);两个组件为Runtime data area(运行时数据区)、Native Interface(本地接口)。1.Class loader(类装载):根据给定的全限定名类名(如:java.lang.Object)来装载class文件到Runtime data area中的method area。2.Execution engine(执行引擎):执行classes中的指令。原创 2020-10-29 17:52:04 · 355 阅读 · 0 评论 -
[jvm]JVM运行机制*
Java程序运行机制步骤1.首先利用IDE集成开发工具编写Java源代码,源文件的后缀为.java;2.再利用编译器(javac命令)将源代码编译成字节码文件,字节码文件的后缀名为.class;3.运行字节码的工作是由解释器(java命令)来完成的。从上图可以看,java文件通过编译器变成了.class文件,接下来类加载器又将这些.class文件加载到JVM中。其实可以一句话来解释:类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个原创 2020-10-29 17:51:37 · 161 阅读 · 0 评论