JVM Java 虚拟机
文章平均质量分 91
程序猿进阶
梦想成为自由职业者
展开
-
逃逸分析:解锁性能的神秘钥匙!
面试管:在Java中新创建的对象一定是在堆上分配内存吗?如果你的答案是“是的”那就需要看看这个文章了。原创 2023-11-04 23:29:34 · 597 阅读 · 86 评论 -
JIT耗时优化
业务流量突增,机器直接接入大量流量,和会消耗太多资源,导致1-2分钟时间内的请求超时导致异常,因此采用流量预热的方式,让机器逐步接入流量,需要预热时长。目前服务接入,通过自动扩缩容应用流量变化,当流量激增时,对机器的启动速度带来了挑战,之前通过优化点火时间,已经将机器从容器创建到可接入流量优化到2分钟左右,但3min的预热时长成为了应对流量激增的瓶颈,因此优化机器从接入流量到能稳定服务的时长,目标缩减到2min以内。什么是服务预热: 应用在刚启动的时候处理相应速度会很慢,只有当热点代码执行了一定次数以后,相原创 2023-10-22 12:24:05 · 378 阅读 · 5 评论 -
性能优化:JIT即时编译与AOT提前编译
JIT与AOT两种不同的编译方式,主要区别在于是否处于运行时进行编译。动态(即时)编译,边运行边编译:在程序运行时,根据算法计算出热点代码,然后进行JIT实时编译,这种方式吞吐量高,有运行时性能加成,可以跑得更快,并可以做到动态生成代码等,但是相对启动速度较慢,并需要一定时间和调用频率才能触发JIT的分层机制。JIT缺点就是编译需要占用运行时资源,会导致进程卡顿。AOT编译能直接将源代码转化为机器码,内存占用低,启动速度快。无需runtime运行,直接将runtime静态链接至最终的程序中,但。原创 2023-10-21 17:09:48 · 998 阅读 · 5 评论 -
JVM Metaspace内存溢出问题
METASPACE 内存溢出问题原创 2022-12-04 09:01:36 · 1933 阅读 · 28 评论 -
Innodb 行锁实现原理
Innodb的行锁是通过给索引的索引项加锁来实现的原创 2022-11-20 11:37:27 · 1232 阅读 · 1 评论 -
JVM 参数及调优
JVM 启动参数规则整理原创 2022-11-19 22:36:11 · 1207 阅读 · 2 评论 -
G1 垃圾回收器
G1 GC(Garbage-First Garbage Collector)通过 -XX:+UseG1GC参数来启用,在JDK 7 被正式推出,相信熟悉 JVM的同学们都不会对它感到陌生。在 JDK 9中,G1被提议设置为默认垃圾收集器(JEP 248)。在官网中,是这样描述G1的:The Garbage-First (G1) collector is a server-style garbage collector, targeted for multi-processor machines wit原创 2021-05-02 19:44:42 · 526 阅读 · 2 评论 -
JVM Dump分析
Thread Dump介绍Thread Dump是非常有用的诊断 Java应用问题的工具。每一个 Java虚拟机都有及时生成所有线程在某一点状态的 thread-dump的能力,虽然各个 Java虚拟机打印的 thread dump略有不同,但是大多都提供了当前活动线程的快照,及 JVM中所有 Java线程的堆栈跟踪信息,堆栈信息一般包含完整的类名及所执行的方法,如果可能的话还有源代码的行数。Thread Dump特点:【1】能在各种操作系统下使用;【2】能在各种 Java应用服务器下使用;【原创 2021-04-16 21:50:29 · 5095 阅读 · 0 评论 -
在线调试工具 Arthas
Arthas(阿尔萨斯) 是 Alibaba开源的 Java诊断工具,深受开发者喜爱。当遇到以下类似问题而束手无策时,Arthas 可以帮助你解决:【1】这个类从哪个 jar 包加载的? 为什么会报各种类相关的 Exception?【2】我改的代码为什么没有执行到? 难道是我没 commit? 分支搞错了?【3】遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?【4】线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!【5】是否有一个全局视角来查看系统.原创 2021-04-16 21:37:33 · 3039 阅读 · 0 评论 -
JVM 频繁 FULL GC 快速排查整理
在分享此案例前,先聊聊哪些场景会导致频繁Full GC:内存泄漏(代码有问题,对象引用没及时释放,导致对象不能及时回收)死循环大对象程序执行了System.gc()尤其是大对象,80%以上的情况就是他。 那么大对象从哪里来的:【1】数据库(包括 Mysql和 Mongodb等 NOSql数据库),结果集太大;【2】第三方接口传输的大对象;【3】消息队列,消息太大;根据多年一线互联网经验,绝大部分情况是数据库大结果集导致。好,现在我们开始介绍这次线上故障:在没有任何发布的.原创 2021-04-16 21:26:55 · 2259 阅读 · 0 评论 -
Out Of Memory 案例
1. Java 堆空间发生频率:5颗星造成原因 无法在 Java 堆中分配对象 吞吐量增加 应用程序无意中保存了对象引用,对象无法被 GC 回收 应用程序过度使用 finalizer。finalizer 对象不能被 GC 立刻回收。finalizer 由结束队列服务的守护线程调用,有时 finalizer 线程的处理能力无法跟上结束队列的增长 解决方案单位对应:GB -> G, g;MB -> M, m;KB -> K...原创 2021-04-15 23:37:56 · 692 阅读 · 0 评论 -
JVM——锁
对象头[每个对象都具有对象头] Mark:对象头的标记(32位),描述对象的 hash、锁信息、垃圾回收标记、年龄;内容包括:①、指向锁记录的指针;②、指向 monitor 的指针;③、GC 标记;④、偏向锁线程 ID;一、偏向锁偏向锁无法使用自旋锁优化,因为一旦有其他线程申请锁,就破坏了偏向锁的假定。偏向锁的目标是,减少无竞争且只有一个线程使用锁的情况下,使用轻量级锁产生的性能消耗。轻量级锁每次申请、释放锁都至少需要一次CAS,但偏向锁只有初始化时需要一次CAS。如果明显存在其他线程申请锁,那么偏原创 2021-04-15 23:37:15 · 243 阅读 · 0 评论 -
Class 类文件结构
计算机是不能直接运行 java代码的,必须要先运行 java虚拟机,再由java虚拟机运行编译后的 java代码。这个编译后的 java代码,就是本文要介绍的java字节码。计算机截止目前只认识0和1,但虚拟机以及大量建立在虚拟机之上的程序语言如雨后春笋般出现并蓬勃发展,将我们编写的程序编译成二进制本地机器码(Native Code)已不再是唯一的选择,越来越多的程序选择与操作系统和机器指令集无关的、平台中立的格式作为程序编译后的存储格式。实现语言无关性的基础仍然是虚拟机和字节码存储格式。Java虚拟机原创 2021-04-15 23:27:59 · 300 阅读 · 1 评论 -
JVM 问题排查工具
Java 开发人员肯定都知道 JDK的 bin 目录中有 “java.exe”、“javac.exe” 这两个命令行工具。下面主要介绍一些监视虚拟机和故障处理的工具。Jvm 入门工具jps(JavaVirtual Machine Process Status Tool):jps是 JDK提供的一个查看当前 Java进程的小工具。显示指定系统内所有的 HotSpot 虚拟机进程。jps常用命令:格式为 jps [options] [hostid] ,jps 可以通过 RMI协议查询开启了 RM原创 2021-04-15 23:26:21 · 886 阅读 · 0 评论 -
Java 虚拟机对象探秘
对象的创建下图便是 Java 对象的创建过程,建议最好能写出来,并且要掌握每一步在做什么。【1】类加载检查:虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有,那必须先执行相应的类加载过程。【2】分配内存:在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需的内存大小在类加载完成后便可确定,为对象分配空间的任务等同于把一块确定大小的内存从 Java 堆中划分出来。分配方式..原创 2021-04-15 23:10:07 · 118 阅读 · 0 评论 -
JVM 内存结构
对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像 C/C++程序开发程序员这样为每一个 new 操作去写对应的delete/free 操作,不容易出现内存泄漏和内存溢出问题。正是因为 Java 程序员把内存控制权利交给 Java 虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会是一个非常艰巨的任务。运行时数据区域Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。JDK1.8 和之前的版本略有不同.原创 2021-04-15 23:08:13 · 128 阅读 · 0 评论 -
双亲委派模型
虚拟机设计团队把类加载阶段中的 “通过一个类的全限定名来获取描述此类的二进制字节流” 这个动作放到 Java虚拟机外部去实现,以便应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”。从 Java 虚拟机的角度上,只存在两种不同的类加载器:一种是启动类加载器(Bootstrap ClassLoader),这个类加载器使用C++语言实现,是虚拟机自身的一部分;另外一种就是其它所有的类加载器,这些类加载器都由 Java语言实现,独立于虚拟机外部,并且全部继承自 java.lang.原创 2021-04-14 23:00:26 · 212 阅读 · 0 评论 -
CPU 100%问题排查总结
排查思路【1】定位高负载进程pid:登录进服务器使用 top 或 top -c命令[ps -ef | grep xxx 命令]查看当前 CPU消耗过高的进程,从而得到进程id。观察各个进程资源使用情况,可以看出进程id为18571的进程,有着较高的CPU占比。按P(大写)可以倒序查看占CPU占用率。【2】根据 Pid查出消耗 cpu最高的线程号:top -Hp 18571,按下P,进程按照 Cpu使用率排序。找出最耗 Cpu的线程,结果发现18584是就耗了99.9%。一般超过80%就是比较高的..原创 2021-04-11 23:38:33 · 364 阅读 · 0 评论 -
Java面试——JVM知识
一、什么情况下会发生栈内存溢出【1】线程请求的栈深度大于虚拟机所允许的深度,将抛出 StackOverflowError 异常。递归的调用一个简单的方法,不断累积就会抛出 StackOverflowError 异常。【2】如果虚拟机在动态扩展栈时无法申请到足够的内存空间,则抛出 OutOfMemoryError 异常。无限循环的创建线程,并对每个线程增加内存。则会抛出 OutOfMemoryError 异常。【注意】:在多线程的情况下,给每个线程的栈分配的内存越大,越容易产生内存溢出异常。操作系统为原创 2021-04-11 23:34:48 · 920 阅读 · 0 评论 -
Java对象结构详解【MarkWord 与锁的实现原理】
Java对象存储在堆(Heap)内存。那么一个 Java对象到底包含什么呢?概括起来分为对象头、对象体和对齐字节。如下图所示:Mark Word(标记字)以上是 Java对象处于5种不同状态时,Mark Word中 64位的表现形式,上面每一行代表对象处于某种状态时的样子。其中各部分的含义如下:【1】lock:2位的锁状态标记位,由于希望用尽可能少的二进制位表示尽可能多的信息,所以设置了 lock标记。该标记的值不同,整个 Mark Word表示的含义不同。biased_lock 和 lock一原创 2021-04-11 23:31:23 · 569 阅读 · 0 评论 -
ZGC 垃圾回收器
ZGC(The Z Garbage Collector)是JDK 11中推出的一款低延迟垃圾回收器,它的设计目标包括:【1】停顿时间不超过10ms;【2】停顿时间不会随着堆的大小,或者活跃对象的大小而增加,影响它的是 GCRoot对象;【3】支持 8MB~4TB级别的堆(未来支持16TB);从设计目标来看,ZGC适用于大内存低延迟服务的内存管理和回收。本文主要介绍 ZGC在低延时场景中的应用和卓越表现,文章内容主要分为四部分:【1】GC之痛:介绍实际业务中遇到的 GC痛点,并分析 CMS收集器和原创 2021-04-11 22:42:59 · 1264 阅读 · 3 评论 -
Java (强/弱/软/虚)引用
一、整体架构二、强引用(默认支持)当内存不足,JVM 开始垃圾回收,对于强引用的对象,就算是出现了 OOM 也不会对该对象进行回收,死都不收。强引用是我们最常见的普通对象引用,只要还有强引用指向一个对象,就能表明对象还“活着”,垃圾回收器不会碰这种对象。在Java 中最常见的就是强引用,把一个对象赋给一个引用变量,这个引用变量就是一个强引用。当一个对象被强引用变量引用时,它处于可达状态,它是不可能被垃圾回收机制回收的,即使该对象以后永远都不会被用到 JVM 也不会回收。因此强引用是造成内存泄漏.原创 2021-04-10 23:30:16 · 147 阅读 · 1 评论