jvm
文章平均质量分 91
JVM它是Java Virtual Machine 的缩写,主要是通过在实际计算机模仿各种计算机功能来实现的,组成部分包括堆、方法区、栈、本地方法栈、程序计算器等部分组成的,其中方法回收堆和方法区是共享区,也就是谁都可以使用,而栈和程序计算器、本地方法栈区是归JVM的。Java能够被称为“一次编译,
Young丶
这个作者很懒,什么都没留下…
展开
-
一步步带你详解JVM性能调优
性能调优性能调优包含多个层次,比如:架构调优、代码调优、JVM调优、数据库调优、操作系统调优等。架构调优和代码调优是JVM调优的基础,其中架构调优是对系统影响最大的。性能调优基本上按照以下步骤进行:明确优化目标、发现性能瓶颈、性能调优、通过监控及数据统计工具获得数据、确认是否达到目标。何时进行JVM调优遇到以下情况,就需要考虑进行JVM调优了:Heap内存(老年代)持续上涨达到设置的最大内存值;Full GC 次数频繁;GC 停顿时间过长(超过1秒);应用出现OutOfMemory 等内原创 2022-03-25 23:36:10 · 4467 阅读 · 0 评论 -
三万字长文:JVM内存问题排查,如何让对JVM一窍不通的我快速开始排查应用内存问题
JVM 的堆空间分成 2 个区域:年轻代、老年代年轻代又进一步细分成 3 个区域:Eden、Survivor From、Survivor To。转载 2024-02-20 17:02:18 · 65 阅读 · 0 评论 -
JVM调优-CMS常见参数、线程计算与推荐配置
该值代表老年代堆空间的使用率,默认值为 68。在 cms gc remark 之前做一次 ygc,减少 gc roots 扫描的对象数,从而提高 remark 的效率,默认关闭。当使用 CMS 收集器时,默认年轻代使用多线程并行执行垃圾回收(UseConcMarkSweepGC 开启后则默认开启)。被启用时,并发的 CMS 阶段将以多线程执行(因此,多个 GC 线程会与所有的应用程序线程并行工作)。该参数启用后 JVM 无论什么时候调用系统 GC,都执行 CMS GC,而不是 Full GC。原创 2023-07-21 07:15:00 · 25921 阅读 · 0 评论 -
一次线上 JVM 调优实践,FullGC40 次 / 天到 10 天一次的优化过程
FullGC 一天超过一次肯定就不正常了。发现 FullGC 频繁的时候优先调查内存泄漏问题。内存泄漏解决后,jvm 可以调优的空间就比较少了,作为学习还可以,否则不要投入太多的时间。如果发现 CPU 持续偏高,排除代码问题后可以找运维咨询下阿里云客服,这次调查过程中就发现 CPU 100% 是由于服务器问题导致的,进行服务器迁移后就正常了。数据查询的时候也是算作服务器的入口流量的,如果访问业务没有这么大量,而且没有攻击的问题的话可以往数据库方面调查。转载 2023-07-20 11:24:26 · 19321 阅读 · 0 评论 -
基于Prometheus的jvm监控指标详解
使用Prometheus 监控Springboot应用参考下面来看看jvm的监控指标#这是一个Summary指标,与Histogram类似,可以对指标数据进行采样。原创 2023-03-23 10:03:44 · 66760 阅读 · 3 评论 -
【JVM 从入门到精通系列】 JVM 字节码指令篇 之 Class文件结构
跨平台的语言当Java源代码成功编译成字节码后,如果想在不同平台上运行,则无需再次编译。这个优势已经不再那么吸引人了,Python、PHP、Perl、Ruby、Lisp等有强大的编译器。跨平台似乎已经快成为一门语言必选的特性。跨语言的平台。原创 2023-01-05 10:15:00 · 57189 阅读 · 0 评论 -
Jvm 系列(十二) JVM的执行引擎全面讲解
一般来讲,JIT编译出来的机器码性能比解释器高,C2编译器启动时长比C1编译器慢,系统稳定执行以后,C2编译器执行速度远远快于C1编译器。自JDK10起,HotSpot又加入了一个全新的即时编译器:Graal编译器。编译效果短短几年就追评了C2编译器。使用 -XX : +UnlocalExperimentalVMOptions -XX:+UseJVMCICompiler去激活,才可以使用。JDK9引入了AOT编译器(静态提前编译器,Ahead Of Time Compiler)。原创 2023-01-04 08:30:00 · 51334 阅读 · 3 评论 -
探讨Linux CPU的上下文切换原由
我们都知道 Linux 是一个多任务操作系统,它支持的任务同时运行的数量远远大于 CPU 的数量。当然,这些任务实际上并不是同时运行的(Single CPU),而是因为系统在短时间内将 CPU 轮流分配给任务,造成了多个任务同时运行的假象。CPU 上下文(CPU Context)在每个任务运行之前,CPU 需要知道在哪里加载和启动任务。这意味着系统需要提前帮助设置 CPU 寄存器和程序计数器。CPU 寄存器是内置于 CPU 中的小型但速度极快的内存。程序计数器用于存储 CPU 正在执行的或下一条要执.原创 2022-05-25 18:43:13 · 2955 阅读 · 1 评论 -
linux CPU 过高,怎么排查问题
今天跟大家就CPU、磁盘、网络及内存方面的问题,聊聊如何排查和调优。CPU过高,怎么排查问题linux内存磁盘IO网络IOjava 应用内存泄漏和频繁 GCjava 线程问题排查常用 jvm 启动参数调优linux CPU 过高,怎么排查问题CPU 指标解析平均负载平均负载等于逻辑 CPU 个数,表示每个 CPU 都恰好被充分利用。如果平均负载大于逻辑 CPU 个数,则负载比较重进程上下文切换无法获取资源而导致的自愿上下文切换被系统强制调度导致的非自愿上原创 2022-05-19 11:57:16 · 6817 阅读 · 0 评论 -
关于Java 垃圾收集器你应该知道这些
如果Java虚拟机中标记清除算法、标记整理算法、复制算法、分代算法这些属于GC收集算法中的方法论,那么“GC收集器”则是这些方法论的具体实现。概念准备下面了解几个概念以帮助后面的学习:线程暂停(Stop The World)、安全点(Safepoint)、安全区(Safe region)。在执行可达性分析的时候会出现在分析的过程中对象关系引用等发生了变化,为了保证分析的准确性,就必须在分析的过程中暂停所有Java线程,Sun将这一事件称作“Stop The World”。那么,什么时候暂停合适呢?并转载 2022-03-26 00:40:49 · 1326 阅读 · 0 评论 -
JVM 性能调优之定位问题 实战篇
继前文JVM 调优监控内置工具 jps、jstack、jmap、jhat、jstat、hprof 使用详解之后我们,来看看在实战中怎么定位性能问题一、cpu占用过高cpu占用过高要分情况讨论,是不是业务上在搞活动,突然有大批的流量进来,而且活动结束后cpu占用率就下降了,如果是这种情况其实可以不用太关心,因为请求越多,需要处理的线程数越多,这是正常的现象。话说回来,如果你的服务器配置本身就差,cpu也只有一个核心,这种情况,稍微多一点流量就真的能够把你的cpu资源耗尽,这时应该考虑先把配置提升吧。第二原创 2022-03-26 00:25:04 · 1751 阅读 · 0 评论 -
JVM 调优监控内置工具 jps、jstack、jmap、jhat、jstat、hprof 使用详解
JDK 内置命令行工具这些命令在 JDK 安装目录下的 bin 目录下:jps (JVM Process Status): 类似 UNIX 的 ps 命令。用于查看所有 Java 进程的启动类、传入参数和 Java 虚拟机参数等信息;jstat(JVM Statistics Monitoring Tool): 用于收集 HotSpot 虚拟机各方面的运行数据;jinfo (Configuration Info for Java) : Configuration Info for Java,显示虚拟原创 2022-03-26 00:21:58 · 2272 阅读 · 0 评论 -
两张图看懂GC 日志
GC日志查看可以通过在java命令种加入参数来指定对应的gc类型,打印gc日志信息并输出至文件等策略。GC的日志是以替换的方式(>)写入的,而不是追加(>>),如果下次写入到同一个文件中的话,以前的GC内容会被清空。对应的参数列表-XX:+PrintGC 输出GC日志-XX:+PrintGCDetails 输出GC的详细日志-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的原创 2022-03-25 23:31:27 · 1563 阅读 · 0 评论 -
JVM 性能调优之定位问题
现实企业级Java应用开发、维护中,有时候我们会碰到下面这些问题:OutOfMemoryError,内存不足内存泄露线程死锁锁争用(Lock Contention)Java进程消耗CPU过高…这些问题在日常开发、维护中可能被很多人忽视(比如有的人遇到上面的问题只是重启服务器或者调大内存,而不会深究问题根源),但能够理解并解决这些问题是Java程序员进阶的必备要求。本文将对一些常用的JVM性能调优监控工具进行介绍,希望能起抛砖引玉之用。一、 jps(Java Virtual Machin原创 2021-12-07 14:44:48 · 4020 阅读 · 0 评论 -
面试官:说说什么是Java内存模型?
由于CPU 和主内存间存在数量级的速率差,想到了引入了多级高速缓存的传统硬件内存架构来解决,多级高速缓存作为 CPU 和主内间的缓冲提升了整体性能。解决了速率差的问题,却又带来了缓存一致性问题。数据同时存在于高速缓存和主内存中,如果不加以规范势必造成灾难,因此在传统机器上又抽象出了内存模型。Java 语言在遵循内存模型的基础上推出了 JMM 规范,目的是解决由于多线程通过共享内存进行通信时,存在的本地内存数据不一致、编译器会对代码指令重排序、处理器会对代码乱序执行等带来的问题。转载 2021-05-06 16:01:37 · 411 阅读 · 3 评论 -
Java后端线上问题排查常用命令收藏
内存瓶颈freefree是查看内存使用情况,包括物理内存、交换内存(swap)和内核缓冲区内存。free -h -s 3表示每隔三秒输出一次内存情况,命令如下[1014154@cc69dd4c5-4tdb5 ~]$ free total used free shared buff/cache availableMem: 119623656 43052220 45611364 4313760原创 2021-03-22 23:41:58 · 659 阅读 · 0 评论 -
知不知道 Thread.sleep(0) 到底有什么用?
我们可能经常会用到 Thread.Sleep 函数来吧使线程挂起一段时间。那么你有没有正确的理解这个函数的用法呢?思考下面这两个问题:假设现在是 2008-4-7 12:00:00.000,如果我调用一下 Thread.Sleep(1000) ,在 2008-4-7 12:00:01.000 的时候,这个线程会不会被唤醒?某人的代码中用了一句看似莫明其妙的话:Thread.Sleep(0) 。既然是 Sleep 0 毫秒,那么他跟去掉这句代码相比,有啥区别么?我们先回顾一下操作系统原理。操作系统中原创 2021-02-24 17:35:49 · 773 阅读 · 0 评论 -
从 CPU、磁盘、内存、网络、GC 一条龙!JAVA 线上故障排查完整套路
线上故障主要会包括cpu、磁盘、内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍。同时例如jstack、jmap等工具也是不囿于一个方面的问题的,基本上出问题就是df、free、top 三连,然后依次jstack、jmap伺候,具体问题具体分析即可。CPU一般来讲我们首先会排查cpu方面的问题。cpu异常往往还是比较好定位的。原因包括业务逻辑问题(死循环)、频繁gc以及上下文切换过多。而最常见的往往是业务逻辑(或者框架逻辑)导致的,可以使用jstack原创 2021-02-24 17:32:26 · 746 阅读 · 0 评论 -
Jvm 系列(十一)Java 语法糖背后的真相
语法糖(Syntactic Sugar),也叫糖衣语法,是英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语。指的是,在计算机语言中添加某种语法,这些语法糖虽然不会对语言的功能产生任何影响,却能使程序员更方便的使用语言开发程序,同时增强程序代码的可读性,避免出错的机会。但是如果只是大量添加和使用语法糖,却不去了解他,容易产生过度依赖,从而无法看清语法糖的糖衣背后,程序代码的真实面目。总而言之,语法糖可以看做是编译器实现的一些“小把戏”,这些“小把戏”可能会使得效率“大提升”,原创 2021-01-26 10:27:22 · 1362 阅读 · 0 评论 -
Jvm 系列(十):Java 即时编译器JIT机制以及编译优化
在部分的商用虚拟机中,Java 程序最初是通过解释器( Interpreter )进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁的时候,就会把这些代码认定为“热点代码”。为了提高热点代码的执行效率,在运行时,即时编译器(Just In Time Compiler )会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化。1、HotSpot 内的即时编译器解释器和编译器各有各的优点:解释器优点:当程序需要迅速启动的时候,解释器可以首先发挥作用,省去了编译的时间,立即执行。解释执行占用原创 2021-01-25 16:43:29 · 1408 阅读 · 0 评论 -
SpringBoot 深度调优,让你的项目飞起来!
项目调优作为一名工程师,项目调优这事,是必须得熟练掌握的事情。在SpringBoot项目中,调优主要通过配置文件和配置JVM的参数的方式进行。一、修改配置文件关于修改配置文件application.properties。SpringBoot项目详细的配置文件修改文档https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html#common-application原创 2021-01-12 22:44:37 · 1274 阅读 · 0 评论 -
10个经典又容易被人疏忽的JVM面试题
前言1. 对象一定分配在堆中吗?有没有了解逃逸分析技术?「对象一定分配在堆中吗?」 不一定的,JVM通过**「逃逸分析」**,那些逃不出方法的对象会在栈上分配。「什么是逃逸分析?」逃逸分析(Escape Analysis),是一种可以有效减少Java 程序中同步负载和内存堆分配压力的跨函数全局数据流分析算法。通过逃逸分析,Java Hotspot编译器能够分析出一个新的对象的引用的使用范围,从而决定是否要将这个对象分配到堆上。❝逃逸分析是指分析指针动态范围的方法,它同编译器优化原理的指针分原创 2021-01-12 22:39:16 · 1199 阅读 · 0 评论 -
万字大白话带你重拾JVM
前言如果在文中用词或者理解方面出现问题,欢迎指出。此文旨在提及而不深究,但会尽量效率地把知识点都抛出来一、JVM的基本介绍JVM 是 Java Virtual Machine 的缩写,它是一个虚构出来的计算机,一种规范。通过在实际的计算机上仿真模拟各类计算机功能实现···好,其实抛开这么专业的句子不说,就知道JVM其实就类似于一台小电脑运行在windows或者linux这些操作系统环境下即可。它直接和操作系统进行交互,与硬件不直接交互,可操作系统可以帮我们完成和硬件进行交互的工作。1.1 Jav原创 2021-01-12 21:57:30 · 1259 阅读 · 0 评论 -
面试官:哪些原因会导致JAVA进程退出?
面试官:哪些原因会导致JAVA进程退出?无外乎三种情况。linux的OOM killer杀死JVM自身故障jvm的OOM导致进程退出(很罕见,我至今没遇见过)引言linux的OOM killerLinux 内核有个机制叫OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了防止内存耗尽而内核会把该进程杀掉。因此,你发现java进程突然没了,首先要怀疑是不是被linux的OOM killer给干掉了!你可原创 2021-01-11 23:49:40 · 1394 阅读 · 0 评论 -
JVM 发生 OOM 的 8 种原因、及解决办法
撸Java的同学,多多少少都会碰到内存溢出(OOM)的场景,但是造成OOM原因却不止一个。堆内存不足这种场景最为常见,报错信息:java.lang.OutOfMemoryError: Java heap space原因1、代码中可能存在大对象分配2、可能存在内存泄露,导致在多次GC之后,还是无法找到一块足够大的内存容纳当前对象。解决方法1、检查是否存在大对象的分配,最有可能的是大数组分配2、通过jmap命令,把堆内存dump下来,使用mat工具分析一下,检查是否存在内存泄露的问题3、如转载 2021-01-11 23:45:11 · 2745 阅读 · 0 评论 -
jvm 系列(九):如何优化 Java GC 「译」
本文由CrowHawk翻译,地址:如何优化Java GC「译」,是Java GC调优的经典佳作。Sangmin Lee发表在Cubrid上的”Become a Java GC Expert”系列文章的第三篇《How to Tune Java Garbage Collection》,本文的作者是韩国人,写在JDK 1.8发布之前,虽然有些地方有些许过时,但整体内容还是非常有价值的。译者此前也看到有人翻译了本文,发现其中有许多错漏生硬和语焉不详之处,因此决定自己翻译一份,供大家分享。GC优化是必要的吗?或转载 2021-01-08 00:00:09 · 2144 阅读 · 0 评论 -
Jvm 系列(八):Jvm 知识点总览
对于Java程序员来讲,spring全家桶几乎可以搞定一切,spring全家桶便是精妙的招式,jvm就是内功心法很重要的一块,线上出现性能问题,jvm调优更是不可回避的问题。因此JVM基础知识对于高级程序员的重要性不必言语,在面试高级开发的时候,jvm相关知识也必定是考核的标准之一。本篇文章会根据之前写的jvm系列文章梳理出jvm需要关注的所有考察点。jvm 总体梳理jvm体系总体分四大块:类的加载机制jvm内存结构GC算法 垃圾回收GC分析 命令调优当然这些知识点在之前的文章中都有详细的原创 2021-01-07 23:31:32 · 2060 阅读 · 0 评论 -
Jvm 系列(七):Jvm 调优-工具篇
工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗费性能的分析(dump文件分析)一般也不会在生产直接分析,往往dump下来的文件达1G左右,人工分析效率较低,因此利用工具来分析jvm相关问题,长长可以到达事半功倍的效果来。jvm监控分析工具一般分为两类,一种是jdk自带的工具,一种是第三方的分析工具。jdk自带工具一般在jdk bin目录下面,以exe的形式直接点击就可以使用,其中包含分析工具已经很强大,几乎涉及了方方面面,但是我们最常使用的只有两款:jconsole.exe和jvisualvm原创 2021-01-07 23:07:36 · 2121 阅读 · 0 评论 -
Jvm 系列(六):Java 服务 GC 参数调优案例
本文介绍了一次生产环境的JVM GC相关参数的调优过程,通过参数的调整避免了GC卡顿对JAVA服务成功率的影响。这段时间在整理jvm系列的文章,无意中发现本文,作者思路清晰通过步步分析最终解决问题。我个人特别喜欢这种实战类的内容,经原作者的授权同意,将文章分享于此。原文链接:Java服务GC参数调优案例,下面为转载此文的内容,备注部分为本人添加,主要起到说明的作用。背景以及遇到的问题我们的Java HTTP服务属于OLTP类型,对成功率和响应时间的要求比较高,在生产环境中出现偶现的成功率突然下降然后又原创 2021-01-07 22:56:32 · 2159 阅读 · 0 评论 -
Java 四种引用类型:强引用、软引用、弱引用、虚引用
以前学习强软弱虚引用的时候,只是走马观花看看博客,并没有自己写代码去实践、去证明,导致每次看完后,过不了多久就忘了,后来下定决心,一定要自己敲敲代码,这样才能让印象更加深刻,古人云:纸上得来终觉浅,绝知此事要躬行。Java中的四种引用Java中有四种引用类型:强引用、软引用、弱引用、虚引用。Java为什么要设计这四种引用Java的内存分配和内存回收,都不需要程序员负责,都是由伟大的JVM去负责,一个对象是否可以被回收,主要看是否有引用指向此对象,说的专业点,叫可达性分析。Java设计这四种引用的主原创 2020-09-03 10:05:35 · 1409 阅读 · 0 评论 -
Jvm 系列(五):Java GC 分析
Java GC就是JVM记录仪,书画了JVM各个分区的表演。什么是 Java GCJava GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢。这是因为在Java虚拟机中,存在自动内存管理和垃圾清扫机制。概括地说,该机...原创 2020-02-09 14:13:06 · 420 阅读 · 0 评论 -
Jvm 系列(四):Jvm 调优-命令篇
运用jvm自带的命令可以方便的在生产监控和打印堆栈的日志信息帮忙我们来定位问题!虽然jvm调优成熟的工具已经有很多:jconsole、大名鼎鼎的VisualVM,IBM的Memory Analyzer等等,但是在生产环境出现问题的时候,一方面工具的使用会有所限制,另一方面喜欢装X的我们,总喜欢在出现问题的时候在终端输入一些命令来解决。所有的工具几乎都是依赖于jdk的接口和底层的这些命令,研究这些命...原创 2020-02-08 11:32:00 · 472 阅读 · 0 评论 -
Jvm 系列(三):GC 算法 垃圾收集器
这篇文件将给大家介绍GC都有哪几种算法,以及JVM都有那些垃圾回收器,它们的工作原理。概述垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了。jvm 中,程序计数器、虚拟机栈、本地方法栈都是随线程而生随线程而灭,栈帧随着方法的进入和退出做入栈和出栈操作,实现了自动的内存清理,因此,我们的内...原创 2020-02-07 13:39:06 · 422 阅读 · 1 评论 -
Jvm 系列(二):Jvm 内存结构
所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemoryError的异常到底涉及到运行时数据的哪块区域?该怎么解决呢?其实如果你经常解决服务器性能问题,那么这些问题就会变的非常常见,了解JVM内存也是为了服务器出现性能问题的时候可以快速的了解那块的内存区域出现问题,以便于快速的解决生产故障。先看一张图,这张图能很清晰的说明JVM内存结构布局。、和。堆内存是JVM中最大的一块由年轻代和老年代组成,而年轻代内存又被分成三部分,、、,默认情况下年轻代按照的比例来分配;原创 2020-02-06 11:46:18 · 524 阅读 · 1 评论 -
Jvm 系列(一):Java 类的加载机制
类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。原创 2020-02-05 15:59:55 · 473 阅读 · 1 评论