JVM
融极
未来像盛夏的大雨,来不及撑伞就已经倾盆而下。
展开
-
JVM线上问题定位命令
jvm原创 2023-02-01 19:08:01 · 789 阅读 · 0 评论 -
JVM相关命令查看GC情况
概述jstat命令格式jstat [options] vmid [interval] [count]参数说明options:选项,一般是-gcutil、-gc查询gc的情况;vmid:vm的进程号,可以使用jps 或者ps -ef|grep 项目名获取interval:间隔时间,单位默认为毫秒count:打印次数,如果缺省则打印无数次示例说明jstat -gcutil pid time获取pid:ps -ef|grep dmq[root@iot5-test-3 2022-02]#原创 2022-02-24 21:34:25 · 7771 阅读 · 0 评论 -
JVM总结
概述参考面渣逆袭:JVM经典五十问,这下面试稳了原创 2022-01-11 18:29:40 · 168 阅读 · 0 评论 -
JVM性能调优实战
概述参考https://www.cnblogs.com/duanxz/tag/JVM%E8%99%9A%E6%8B%9F%E6%9C%BA/default.html?page=1原创 2021-03-04 22:45:19 · 161 阅读 · 1 评论 -
JVM运行时参数--下篇
JVM参数选项类型标准参数选项特点比较稳定,后续版本基本不会变化以 - 开头各种选项运行java或者java -help可以看到所有的标准选项补充内容-server与-client-X参数选项特点非标准化参数功能还是比较稳定的,但是官方说后续版本可能会变更(可能性比较小)以 -X 开头各种选项运行java -X 命令可以看到所有的X选项JVM的JIT编译模式相关的选项Xint禁用JIT,所有字节码都被解释执行,这个模式的速度是最慢的。Xcomp原创 2021-02-19 22:22:38 · 193 阅读 · 0 评论 -
JVM监控与诊断的GUI工具--下篇
概述原创 2021-02-19 20:46:16 · 134 阅读 · 0 评论 -
JVM命令行监控工具--下篇
概述性能诊断是软件工程师在日程工作中需要经常面对和解决的问题。在用户体验至上的今天,解决好应用的性能问题能带来非常大的收益。Java作为最流行的编程语言之一,其应用性能诊断一直受到业界广泛关注。可能造成Java应用出现性能问题的因素非常多,例如线程控制、磁盘读写、数据库访问、网络I/O、垃圾收集等。想要定位这些问题,一款优秀的性能诊断工具必不可少。体会1:使用数据说明问题,使用知识分析问题,使用工具处理问题。体会2:无监控、不调优!jps查看正在运行的Java进程基本情况jps(Java原创 2021-02-17 20:43:42 · 178 阅读 · 1 评论 -
性能指标--下篇
停顿时间(或者响应时间)吞吐量对单位时间内完成的工作量(请求)的度量在GC中:运行用户代码的时间占总运行时间的比例(总运行时间:程序的运行时间+内存回收的时间),吞吐量为1-1/(1+n),-XX:GCTimeRatio=n并发数同一时刻,对服务器有实际交货的请求数。内存占用Java堆区所占用的内存大小相互间的关系以高速公路通行状况为例...原创 2021-02-17 19:38:18 · 118 阅读 · 0 评论 -
性能优化三部曲--下篇
第一步(发现问题):性能监控GC频繁CPU LOAD过高OOM内存泄漏死锁程序响应时间较长第二步(排查问题):性能分析打印GC日志,通过GCviewer或者gceasy来分析日志信息灵活运用命令行工具,jstack,jmap,jinfo等dump出堆文件,使用内存分析工具分析文件使用阿里Arthas,或jconsole,JVisualVM来实时查看JVM状态。jstack查看堆栈信息。第三步(解决问题):性能调优适当增加内存,根据业务背景选择垃圾回收器。优化代码,控制原创 2021-02-17 19:21:21 · 337 阅读 · 0 评论 -
调优与监控的依据--下篇
生产环境中的问题生产环境发生了内存溢出该如何处理?生产环境应该给服务器分配多少内存合适?如何对垃圾回收器的性能进行调优?生产环境CPU负载飙高该如何处理?生产环境应该给应用分配多少线程合适?不加log,如何确定请求是否执行了某一行代码?不加log,如何实时查看某个方法的入参与返回值?为什么要调优防止出现OOM解决OOM减少Full GC出现的频率不同阶段的考虑上线前项目运行阶段线上出现OOM监控的依据运行日志异常堆栈GC日志线程快照堆转储快照调优的原创 2021-02-17 19:06:43 · 149 阅读 · 0 评论 -
ZGC
概述ZGC:The Garbage CollectorZGC与Shenandoah目标高度相似,在尽可能对吞吐量影响不大的前提下,实现在任意堆内存大小下都可以把垃圾收集的停顿时间限制在10ms以内的低延迟。《深入理解java虚拟机》一书中这样定义ZGC;ZGC收集器是一款基于Region内存布局的,(暂时)不设分代的,使用了读屏障、染色指针和内存多重映射等技术实现可并发的标记-压缩算法的,以低延迟为首要目标的一款垃圾收集器。ZGC的工作过程可以分为4个阶段:并发标记-并发预备重分配-并发重分配-并原创 2021-02-17 17:54:16 · 179 阅读 · 0 评论 -
日志分析工具
日志文件保存-Xloggc:/path/to/gc.log./ 表示当前工程,在当前工程下创建一个logs目录。常见的日志分析工具原创 2021-02-17 17:25:29 · 156 阅读 · 0 评论 -
GC日志分析
概述通过阅读GC日志,我们可以了解java虚拟机内存分配与回收策略。内存分配与垃圾回收的参数列表-XX:+PrintGC 输出GC日志。类似:-verbose:gc-XX:+PrintGCDetails 输出GC的详细日志-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)-XX:PrintGCDateStamps 输出GC的时间戳(以日期的形式,如2013-05-04T21:53:59.234+0800)-XX:+PrintHeapAtG原创 2021-02-16 23:21:34 · 200 阅读 · 0 评论 -
垃圾回收器
GC分类和性能指标垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本。从不同角度分析垃圾收集器,可以将GC分为不同的类型。按垃圾回收线程数分可以分为串行垃圾回收器和并行垃圾回收器。串行回收指的是在同一时间段内只允许一个CPU用于执行垃圾回收操作,此时工作线程被暂停,直至垃圾收集结束。在诸如但CPU处理器或者较小的应用内存等硬件平台不是特别优越的场合,串行回收器的性能表现可以超原创 2021-02-07 22:35:42 · 192 阅读 · 0 评论 -
垃圾回收相关概念
System.gc()的理解默认情况下,通过System.gc()或者Runtime.getRuntime().gc()的调用,会显示触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。然而System.gc()调用附带一个免责声明,无法保证对垃圾收集器的调用。(相当于提醒垃圾回收器去进行full gc,但是垃圾回收器会不会执行看垃圾回收器心情)JVM实现者可以通过System.gc()调用来决定JVM的GC行为。而一般情况下,垃圾回收应该是自动进行的,无须手动触发,否则原创 2021-02-03 21:49:41 · 144 阅读 · 0 评论 -
垃圾回收算法
垃圾标记阶段的算法基础概述对象存活判断在堆里存放着集合所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。只有被标记为已经死亡的对象,GC才会在执行垃圾回收时,释放掉其所占用的内存空间,因此这个过程我们可以称为垃圾标记阶段。那么在JVM中究竟是如何标记一个死亡对象呢?简单来说,当一个对象已经不再被任何的存活对象继续引用时,就可以宣判为已经死亡。判断对象存活一般有两种方式:引用计数算法和可达性分析算法。引用计数算法...原创 2020-12-22 00:48:02 · 211 阅读 · 0 评论 -
垃圾回收概述
一、学习JVM、垃圾回收的目的1、主要目的之一是最终是为了程序的性能。二、什么是垃圾原创 2020-12-17 23:03:47 · 182 阅读 · 1 评论 -
Java String(JVM角度)
基本特性存储结构变更jdk8及之前的jdk版本中,String的内存存储结构是char[]字符数组,但是在Jdk9及之后改成了byte[]字节数组。原因是,堆空间中大部分的字符串内容都是latin字符,基本上一个byte就可以表示,但是char占两个字节,导致一半的内存浪费得不到合理使用。对于需要两个字节表示的字符串,String中添加了一个字符编码集标识,如果是lation/ISO-8859-1就使用一个byte去存在,gbk等字符集使用两个字节去存储。对于和String相关的类也做了修改原创 2020-12-09 22:11:41 · 278 阅读 · 1 评论 -
JVM执行引擎
概述执行引擎是Java虚拟机核心的组成部分之一“虚拟机”是一个相对于“物理机”的概念,这两种集群都有代码执行的能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操纵系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约的定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被JVM所识别的字节原创 2020-12-02 22:05:20 · 239 阅读 · 0 评论 -
直接内存
概述不是虚拟机运行时数据区的一部分,也不是《java虚拟机规范》中定义的内存区域,学习它的目的是因为Java8中的元空间的落地方案就是直接内存实现的。直接内存是在java堆外的,直接向系统申请的内存区间。来源于NIO,通过存在堆中的DirectByteBuffer存在Native内存通常,访问直接内存的速度会优于java堆,即读写性能高。因此处于性能考虑,读写频繁的场合可能会考虑使用直接内存。java的NIO库允许Java程序使用直接内存,用于数据缓冲区。非直接缓冲区,使用传统的jvm堆原创 2020-12-02 21:49:46 · 153 阅读 · 0 评论 -
对象实例化、内存布局和访问定位
对象的实例化创建对象的方式new 方式最常见的方式静态方法中调用newxxxbuild/xxxFactory的静态方法Class的newInstance():反射的方式,只能调用空参的构造器,构造器的权限必须是PublicConstructor的newinstance(…args):反射的方式,可以调用空参、带参的构造器、权限没有要求使用clone():不调用任何构造器,类型需要实现Cloneable接口,实现clone()方法。使用反序列化:从文件中,网络中获取一个对象的二进制原创 2020-11-29 19:46:43 · 163 阅读 · 0 评论 -
JVM方法区(元空间)
概述运行时数据区概览从线程共享的角度看方法区、堆、栈、程序计数器方法区、堆、栈之间的关系栈中的reference就是person变量,堆中的到对象类型数据的指针指向方法区的对象类型数据就是Person。...原创 2020-11-17 23:13:53 · 7538 阅读 · 2 评论 -
代码优化(JVM角度)
代码优化之栈上分配原创 2020-11-11 22:59:23 · 158 阅读 · 0 评论 -
jvm堆空间
概述在JVM中的位置如下:堆空间对进程来说是唯一的,线程是共享的,一个进程对应一个JVM实例。一个JVM实例只存在一个堆内存,堆也是java内存管理的核心区域。Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间。堆内存的大小是可以调节的。《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。所有的线程共享java堆,在这里还可以划分线程私有的缓冲器(Thread Local Allocation Bu原创 2020-10-30 23:04:03 · 485 阅读 · 2 评论 -
本地方法栈与本地方法接口
概述简单的说,一个Native Method就是一个Java调用非Java方法的接口。Native Method方法:该方法的实现由非Java语言实现,比如C,这个特征并非Java所特有,很多其他的编程语言都有这一机制,比如在C++中,可以使用extern “C” 告知C++编译器去调用一个C的函数。在定义一个native method时,并不提供实现体(有些像定义一个Java interface),因为其实现体是由非Java语言在外面实现的。本地接口的作用是融合不同的编程语言为Java所用,它原创 2020-10-28 21:47:46 · 289 阅读 · 0 评论 -
虚拟机栈整体结构
一、概述栈是运行时的单位,堆是存储的单位。即:栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储的问题,即数据怎么放,放在哪。运行时数据区整体结构:二、虚拟机栈基本内容Java虚拟机栈是什么java虚拟机栈,早期也叫java栈,每个线程在创建的时候都会创建一个虚拟机栈,其内部保存一个个的栈帧(stack frame),一个栈帧对应一个java方法调用。与PC寄出去一样是线程私有的。生命周期生命周期与线程一致。作用主管Java程序的运行,参与方法的调用和返回原创 2020-10-09 22:09:06 · 466 阅读 · 0 评论 -
PC寄存器
一、概述JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息,CPU只有把数据装载到寄存器才能够运行。这里,并非是广义上所指的物理寄存器,或许将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序钩子,指向程序中的指令行号地址),并且也不容易引起一些不必要的误会。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟,是一种软件层面的概念。二、作用PC寄存器用来存储下一条指令的地址,也即将要执行的原创 2020-10-07 13:13:56 · 6268 阅读 · 0 评论 -
Java线程
一、概述线程是一个程序的运行单元。JVM允许一个应用有多个线程并行的执行。在hotspot JVM里,每个线程都与操作系统的本地线程直接映射。当一个java线程准备好执行后,此时操作系统的本地线程也同时创建。Java线程执行终止后,本地线程也会回收。操作系统负责所有线程的安排调度到任何一个可有的CPU上。一旦本地线程初始化成功,它就会调用Java线程中的run()方法。二、JVM系统线程后台线程不包括调用public static void main(String[])的main线程以及所有原创 2020-10-07 12:31:16 · 118 阅读 · 0 评论 -
java虚拟机栈
一、概述运行时数据区大概在整个class对象执行的过程中的位置。内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM内存布局规定了java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的JVM对于内存的划分方式和管理机制存在着部分差异。一个虚拟机对应一个Runtime,Runtime对应下面的Runtime Data Area,在Java中表示为一个Class类。具体内存分配(元空间就是方法区的落地实现):Java原创 2020-10-06 13:29:31 · 522 阅读 · 0 评论 -
Java沙箱安全机制
一、概念保证对java核心源代码的保护,就是沙箱安全机制。就是一种保护机制,保护源代码,保护JVM不受恶意代码的破坏。二、示例自定义的String类(java.lang.String),但是加载自定义类的时候回率先使用引导类加载器加载,而引导类加载器在加载的时候先加载jdk自带的文件(rt.jar包中的java\lang\String.class),不会加载自定义的String类,这样就保护了java的源码,不会受到污染。...原创 2020-10-06 10:56:20 · 635 阅读 · 0 评论 -
类的双亲委派机制
一、概念Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象。而且加载某个类的class文件时,Java虚拟机采用的是双亲委派模式,即把请求交给父类(上层)处理,它一种任务委派模式。举例备注:引导类加载SPI的接口,应用类加载器加载SPI接口的实现类。二、优势避免类的重复加载保护程序安全,防止核心API被随意篡改...原创 2020-10-05 12:41:20 · 180 阅读 · 0 评论 -
类加载子系统
一、JVM执行全景图二、类加载器子系统详情结构类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定文件标识(java class的魔数)。ClassLoader只负责class文件的加载,至于加载后是否能够运行,则由Execution Engine决定。加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量。(这部分常量信息是class文件中常量池部分的内存映射)三、类加载器Class原创 2020-09-20 23:09:17 · 228 阅读 · 0 评论 -
JVM生命周期
一、JVM启动java虚拟机的启动时通过引导类加载器(bootstrap class loader)创建的一个初始类来完成的,这个初始类由具体的虚拟机实现指定。虚拟机的启动是按需启动,只有在程序用到的时候才会启动,一个虚拟机对应的一个进程,可以通过jps查询相应的进程。二、JVM的执行一个运行中Java虚拟机有着一个清晰的任务:执行java程序。程序开始执行时它才会运行,程序结束时他就停止(生命周期是与程序同步的)。执行一个所谓的Java程序的时候,真正执行的是一个叫做java虚拟机的进程。原创 2020-09-20 20:42:44 · 187 阅读 · 0 评论 -
JVM与Java体系结构
前言运行着的线上系统突然卡死,系统无法访问,甚至直接OOMM!想解决线上JVM GC问题,但却无从下手。新项目上线,对各种JVM参数设置一脸茫然,直接默认。每次面试之前都要重新背一遍JVM的一些原理概念性的东西,然而面试官却经常问你在实际项目中如何调优JVM参数,如何解决GC,OOM等问题,一脸懵逼。我们的应用程序在所在的位置:JVM是java应用的基础,java API是Java提供的sdk相应的接口;一些开源框架建立在java SDK的基础上;我们写的应用程序建立在java SDK和开原创 2020-09-15 22:56:22 · 144 阅读 · 0 评论 -
Class文件结构解析
JVM 类文件结构详解原创 2020-05-31 22:06:46 · 254 阅读 · 0 评论