
JVM
文章平均质量分 85
JVM
JavaEdge聊AI
关注并私信我,获取更多大厂求职经验。
《编程严选网》创始人,多年大厂一线开发经验,现魔都一线数据中心软件架构师。全网近30w粉丝,擅长分布式系统设计和AIGC应用开发。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
JVM 的Lock Record简介
Lock Record是JVM中用于优化同步机制的关键数据结构,主要应用于偏向锁和轻量级锁场景。它存储锁对象的元数据(如Mark Word拷贝)和对象指针,支持锁重入计数功能。每个线程的私有栈中会动态创建Lock Record(数量随锁持有情况增减),包含displaced mark word(保存原始对象头信息)和对象引用字段。在字节码解释器执行monitorenter指令时,Lock Record会被分配在当前线程的解释栈帧上,帮助实现高效同步。OpenJDK通过BasicObjectLock和Basi原创 2020-04-04 21:51:08 · 10598 阅读 · 6 评论 -
OOM和频繁GC预防方案
这段代码明明很简单,日常跑的都没问题,怎么一大促就卡死甚至进程挂掉?大多是因为设计时,就没针对高并发、高吞吐量case考虑过内存管理。原创 2022-09-10 15:08:49 · 563 阅读 · 0 评论 -
如何避免内存溢出和频繁的垃圾回收
高并发时程序忙,短时内创建大量对象,迅速占满内存,这时无内存可用,GC开始启动,并且这次被迫执行的GC面临的是占满整个内存的海量对象,其执行时间也长,相应回收过程会导致进程长时间暂停,进一步导致大量请求被积压待处理。等GC刚结束,更多请求立刻涌进,迅速占满内存,再次被迫执行GC,进入恶性循环。若晋升对象过多,大于老年代的连续内存空间,也会触发Full Gc,然后在这些处理文本的业务流程中,防止频繁创建一次性的大对象,把文本对象做为业务流程直接传递下去,若这些文本需复用,可将他保存起来,防止频繁创建。原创 2023-01-15 02:34:45 · 4491 阅读 · 0 评论 -
JDK性能调优神器
jps类似Linux的ps,但jps只列出Java进程。可方便查看Java进程的启动类、传入参数和JVM参数。直接运行,不加参数,列出Java程序的进程ID及Main函数名称。jps命令本质也是Java程序-m:输出传递给Java进程的参数-l:输出主函数的完整路径-q:只输出进程ID-v:显示传递给jvm的参数jstat观察Java应用程序运行时信息的工具,详细查看堆使用情况以及GC情况。原创 2021-05-19 14:47:13 · 11701 阅读 · 31 评论 -
Java NIO为何导致堆外内存OOM了?
某天报警:某台机器部署的一个服务突然无法访问。谨记第一反应登录机器查看日志,因为服务挂掉,很可能因OOM。这个时候在机器的日志中发现了如下的一些信息:nio handle failed java.lang.OutOfMemoryError: Direct buffer memory at org.eclipse.jetty.io.nio.xxxxat org.eclipse.jetty.io.nio.xxxx at org.eclipse.jetty.io.nio.xxxx表明确实为OOM,问题是原创 2022-02-01 18:54:41 · 5016 阅读 · 6 评论 -
如何优化生产环境的Full GC?
大部分工程师开发完一个系统后,部署生产环境的时候往往不对JVM进行参数设置,直接用默认JVM参数,这绝对是系统负载逐渐增高的时最大问题如你不设置-Xmx、-Xms之类的堆内存大小,你启动一个系统,可能默认就给你几百MB的堆内存大小,新生代和老年代可能都是几百M。很多后台系统都用默认JVM参数部署启动,前期没啥问题,但中后期开始,当有一定用户量和一定负载,就会出现惊喜。Eden过小,导致频繁触发YGC,Survivor过小,导致经常在YGC后存活对象其实也没多少,但Survivor放不下,导致对象经常进原创 2022-01-29 20:09:39 · 1241 阅读 · 1 评论 -
JVM运行状态评估及优化
预估性优化估算系统QPS,每个请求会创建多少对象,占多少内存,机器配置选型,年轻代应该给多少内存,YGC触发频率,对象进入老年代的速率,老年代应该给多少内存,Full GC触发的频率。这些都是根据代码可大概合理预估的。预估完成后,就能采用优化思路,先给自己的系统设置一些初始JVM参数。如堆内存大小,年轻代大小,Eden和Survivor的比例,老年代的大小,大对象的阈值,大龄对象进入老年代的阈值等。优化思路很简单,尽量让:$每次 YGC 后的存活对象 < Survivor区/2 $保证都留存在年轻原创 2022-01-29 15:57:30 · 2387 阅读 · 5 评论 -
手把手教你如何写出完美的JVM的Young GC
JVM参数示范(基于JDK 1.8)用如下JVM参数运行代码:# 初始新生代大小 5M-XX:NewSize=5242880# 最大新生代大小 5M-XX:MaxNewSize=5242880# 初始堆大小 10M-XX:InitialHeapSize=10485760# 最大堆大小 10M-XX:MaxHeapSize=10485760-XX:SurvivorRatio=8# 大对象阈值是10MB-XX:PretenureSizeThreshold=10485760-XX:+Us原创 2022-01-26 14:44:30 · 1604 阅读 · 7 评论 -
一文搞懂Y-GC和Full GC的触发条件
1 Young GC触发时机一般在新生代Eden区满后触发,采用复制算法回收新生代垃圾。2 Old GC和Full GC的触发时机2.1发生Young GC前检查,若老年代可用连续内存空间<新生代历次YoungGC后升入老年代的对象总和的平均大小老年代可用连续内存空间 < 新生代历次Young GC后升入老年代的对象总和的平均大小老年代可用连续内存空间<新生代历次YoungGC后升入老年代的对象总和的平均大小说明本次Y-GC后,可能升入老年代的对象大小超过老年代当前可用内存空原创 2022-01-25 15:33:43 · 2340 阅读 · 4 评论 -
阿里二面:说说JVM的Stop the World?
新生代GC案例若系统不停运行,然后把Eden给搞满:此时必然触发Minor GC,有专门GC线程执行GC,且对不同内存区域有不同垃圾回收器,这相当于GC线程和垃圾回收器配合,使用自己的GC算法对指定内存区域执GC:垃圾回收一定会通过一个后台运行的GC线程,如针对新生代用ParNew垃圾回收器,其针对新生代采用复制算法:标记Eden区中的存活对象,然后全部转移到Survivor1,然后一次性清空Eden中垃圾对象:接着系统继续运行,新对象继续分配在Eden:当Eden再满,又触发Minor原创 2022-01-21 22:51:08 · 7222 阅读 · 17 评论 -
彻底理解对象内存分配及Minor GC和Full GC全过程
彻底理解对象内存分配及Minor GC和Full GC全过程线上的老年代频繁Full GC的案例,理解:整个对象分配以及转移到老年代Minor GC和Full GC过程案例某数据计算系统,日处理数据量在上亿的规模。系统会不断从MySQL及其他数据源提取大量数据,加载到自己的JVM内存进行计算处理:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nh0UrmXJ-1642342394970)(https://dispatcher-upload.bj.bcebos.原创 2022-01-16 22:16:02 · 2668 阅读 · 1 评论 -
Java及JVM是如何识别重载、重写方法的?
可变长参数方法的重载造成的。(官方文档建议避免重载可变长参数方法,见[1]的最后一段。案例void invoke(Object obj, Object... args) { ... }void invoke(String s, Object obj, Object... args) { ... }invoke(null, 1); // 调用第二个invoke方法invoke(null, 1, 2); // 调用第二个invoke方法invoke(null, new Object[]{1}原创 2021-12-25 05:22:49 · 6023 阅读 · 7 评论 -
Java的Instrumentation类原理分析
利用 java.lang.instrument 做动态 Instrumentation 是 Java SE 5 的新特性,它把 Java 的 instrument 功能从本地代码中解放出来,使之可以用 Java 代码的方式解决问题。使用 Instrumentation,开发者可以构建一个独立于应用程序的代理程序(Agent),用来监测和协助运行在 JVM 上的程序,甚至能够替换和修改某些类的定义。原创 2020-03-20 16:04:07 · 3804 阅读 · 0 评论 -
"org.jacoco.agent.rt" 在 maven 中找不到
看起来没有,不提供源码https://github.com/jacoco/jacoco/issues/207原创 2020-03-20 15:54:06 · 3977 阅读 · 0 评论 -
你连存活到JDK8中著名的Bug都不知道,我怎么敢给你加薪
CopyOnWriteArrayList.java和ArrayList.java,这2个类的构造函数,注释中有一句话 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public ArrayList(Collection<? ...原创 2020-03-10 09:56:19 · 50376 阅读 · 56 评论 -
Java系统程序Bug解决方法论(一) - 教程简介
对于系统地介绍Java问题定位类的教程少之又少,即使有这方面的内容,往往也是一笔带过。本教程系统地介绍Java问题定位技术,我相信有一些很少公开的定位技术,在正确使用时,可以产生令人惊讶的效果。采用Java开发的大型应用系统越来越大、越来越复杂;很多系统甚至是将很多第三方系统 集成在一起,整个系统看起来像一个黑盒子。系统运行遭遇问题(系统停止响应,运行越来越 慢,或者性能低下,甚至系统core ...原创 2020-03-06 17:34:29 · 4549 阅读 · 2 评论 -
计算机为何可以运行Java代码?
Java代码有很多种不同的运行方式。比如说可以在开发工具中运行,可以双击执行jar文件运行,也可以在命令行中运行,甚至可以在网页。这些执行方式都离不开JRE,Java运行时环境。JRE仅包含运行Java程序的必需组件,包括Java虚拟机以及Java核心类库等。我们Java程序员经常接触到的JDK(Java开发工具包)同样包含了JRE,并且还附带了一系列开发、诊断工具。然而,运行C++代码则无需额外的运行时。往往把这些代码直接编译成CPU所能理解的代码格式,即机器码。比如下图的中间列,就是用C语言写的原创 2021-12-21 00:27:59 · 5318 阅读 · 20 评论 -
Java与线程
并发不一定要依赖多线程(如PHP的多进程并发),但在Java中谈论并发,大多数都与线程脱不开关系。线程的实现线程是CPU调度的基本单位。Thread类与大部分的Java API有显著的差别,它的所有关键方法都是声明为Native的。意味着这个方法没有使用或无法使用平台无关的手段来实现。内核线程(Kernel-Level Thread,KLT)直接由操作系统内核(Kermel,下称内核)支持的线程由内核来完成线程切换,内核通过操纵调度器(Sheduler) 对线程进行调度,并负责将线程的任务映射原创 2021-09-14 12:34:00 · 744 阅读 · 0 评论 -
百度面试题:一个线程 OOM 后,其他线程还能运行吗?
由于面试官仅提到OOM,但 Java 的OOM又分很多类型的呀:堆溢出(“java.lang.OutOfMemoryError: Java heap space”)永久代溢出(“java.lang.OutOfMemoryError:Permgen space”)不能创建线程(“java.lang.OutOfMemoryError:Unable to create new native thread”)OutOfMemoryError异常在《Java虚拟机规范》里,除了程序计数器外,虚拟机内存的.原创 2021-06-28 19:23:29 · 6084 阅读 · 25 评论 -
华为技术专家居然把JVM内存模型讲解这么细致
全是干货的技术号:本文已收录在【github面试知识仓库】,欢迎 star/fork:https://github.com/Wasabi1234/Java-Interview-Tutorial内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着os和应用程序的实时运行。JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM高效稳定运行。不同JVM对于内存的划分方式和管理机制存在差异。结合JVM虚拟机规范,来探讨经典JVM内存布局。JVM运行时数据区.原创 2021-05-05 12:10:53 · 21805 阅读 · 44 评论 -
JVM频繁fullgc优化策略
确定是内存泄漏还是确实内存不够用。前者则修复问题,后者则增加内存如果没有增加内存的条件,则考虑重构优化,比如原来的进程内缓存改为远程缓存,以减少内存使用如果不能通过简单的手段减少内存使用,则需要做架构层面的重构,将功能拆分成多个服务。是内存溢出还是实际有大对象,内存溢出就dump分析解决掉。大对象如果有业务需求,用offheap....原创 2021-03-27 19:39:33 · 1291 阅读 · 1 评论 -
JDK为何自己首先破坏双亲委派模型?
说是双亲,其实单亲,无奈迎合历史的错误翻译吧。1 工作流程当一个类加载器收到一个类加载请求在 JDK9 后,会首先搜索它的内建加载器定义的所有“具名模块”:如果找到合适的模块定义,将会使用该加载器来加载如果未找到,则会将该请求委派给父级加载器去加载因此所有的类加载请求最终都应该被传入到启动类加载器(Bootstrap ClassLoader)中,只有当父级加载器反馈无法完成这个列的加载请求时(它的搜索范围内不存在这个类),子级加载器才尝试加载。在类路径下找到的类将成为这些加载器的无名原创 2021-01-19 20:35:49 · 1430 阅读 · 0 评论 -
图解什么是Java虚拟机(JVM)
JVM : Java Virtual Machine ,也就是Java虚拟机。虚拟机是指:通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的计算机系统。JVM是通过软件来模拟Java字节码的指令集,是Java程序的运行环境。原创 2021-01-17 23:17:44 · 1425 阅读 · 1 评论 -
JVM栈上分配对象内存与逃逸分析原理分析(Escape Analysis)
1 逃逸分析JVM中较前沿的优化技术,它与类型继承关系分析一样,并非直接优化代码,而是为其他优化措施提供依据的分析技术。1.1 基本原理分析对象动态作用域,当一个对象在方法里面被定义后,它可能被外部方法所引用例如作为调用参数传递给其他方法,称为方法逃逸被外部线程访问譬如赋值给可以在其他线程中访问的实例变量,称为线程逃逸从不逃逸 =》方法逃逸 =》线程逃逸,称为对象由低到高的不同逃逸程度。如果能证明一个对象不会逃逸到方法或线程外(即别的方法或线程无法通过任何途径访问到该对象),或逃逸程度原创 2020-07-26 19:46:43 · 2155 阅读 · 1 评论 -
JVM类加载、验证、准备、解析、初始化、卸载过程详解
任何程序都需要加载到内存才能与CPU进行交流同理, 字节码.class文件同样需要加载到内存中,才可以实例化类ClassLoader的使命就是提前加载.class 类文件到内存中在加载类时,使用的是Parents Delegation Model(溯源委派加载模型)Java的类加载器是一个运行时核心基础设施模块,主要是在启动之初进行类的加载、链接、初始化第一步,Load阶段读取类文件产生二进制流,并转为特定数据结构,初步校验cafe babe魔法数、常量池、文件长度、是否有父类等,然后创建对应原创 2020-06-20 21:06:08 · 2260 阅读 · 0 评论 -
Happens-beofre 先行发生原则(JVM 规范)
如果JMM中所有的有序性都只靠volatile和synchronized,那么有一些操作将会变得很繁琐,但我们在编写Java并发代码时并没有感到这一点,这是因为Java语言中有一个先行发生(Happen-Before)原则这个原则非常重要,它是判断数据是否存在竞争,线程是否安全的主要依赖。先行发生原则指的是JMM中定义的两项操作之间的依序关系happens- before关系 主要用于强调两个有冲突的动作之间的顺序,以及定义数据争用的发生时机如果说操作A先行发生于操作B,就是在说发生B前,A产生的原创 2020-05-31 19:36:28 · 1695 阅读 · 0 评论 -
面试阿里,这篇JVM垃圾回收算法就够了
程序计数器、虚拟机栈、本地方法栈都是线程私有的,会随着线程而生,随线程而灭;栈中的栈帧随着方法的进入和退出有条不紊的执行着出栈和入栈操作.每个栈帧中的本地变量表都是在类被加载的时候就确定的,每一个栈帧中分配多少内存基本上是在类结构确定时就已知了,因此这几块区域内存分配和回收都具备确定性,就不需要过多考虑回收问题了.然而,Java堆和方法区中的内存清理工作就没那么容易了.堆和方法区所有线程共...原创 2020-04-16 20:43:15 · 1915 阅读 · 0 评论 -
阿里面试官问我内存池Memory Pool是什么,以为我不知道,其实我都懂!
在翻阅 Java 编程思想英文原版时,读到了 pool of memory一词,而 Java 的堆内容就属于内存池。内存池(Memory Pool),又被称为固定大小区块规划(fixed-size-blocks allocation),允许程序员以类似 C语言 的 malloc 或是 C++ 的 new 操作数进行动态的存储器规划。对于其它动态存储器规划的实践来说,因为会变动存储器区块大小导致的...原创 2020-04-14 22:20:20 · 3475 阅读 · 7 评论 -
面试完才知道MESI缓存一致性协议竟然和 volatile 没有半毛关系!
缓存一致性协议和 java 的 volatile 实现无任何关系cache line的概念 缓存行对齐 伪共享a. cache是以cache line为单位与内存映射的,cache只要命中了就是命中64字节,对应内存中连续的64个地址,这64个地址刚好对应了地址的低6位。所以这6位被划为一个段。b. cache分为了64组,要有hash方式确定内存中的地址在哪个cache组,可以用36位地址...原创 2020-04-04 22:27:56 · 3662 阅读 · 13 评论 -
Java的volatile到底该如何理解?
4 volatile 关键字可见性问题让一个线程对共享变量的修改,能够及时的被其他线程看到。根据JMM中规定的happen before和同步原则:对某个volatile字段的写操作happens- before每个后续对该volatile字段的读操作。对volatile变量v的写入,与所有其他线程后续对v的读同步要满足这些条件,所以volatile关键字就有这些功能:禁止缓存...原创 2020-04-04 22:15:57 · 2200 阅读 · 6 评论 -
Java内存模型深入详解(JMM)
前言定义俩共享变量及俩方法:第一个方法,第二个方法(r1,r2)的可能值有哪些?在单线程环境下,可先调用第一个方法,最终(r1,r2)为(1,0)也可以先调用第二个方法,最终为(0,2)。1 Java内存模型的意义JMM 与硬件内存架构对应关系JMM抽象结构图内存模型描述程序的可能行为。Java虚拟机规范中试图定义一种Java内存模型,来屏蔽掉各种硬件和os的内存访问差异,规定:线程如何、何时能看到其他线程修改过的共享变量的值必要时,如何同步地访问共享变量以实现原创 2020-04-04 22:14:54 · 2050 阅读 · 0 评论 -
Java的synchronized关键字和锁升级过程详解
1 大厂面试题请描述synchrnoized和reentrantlock的底层实现及重入的底层原理- 百度阿里请描述锁的四种状态和升级过程-百度阿里CAS的ABA问题如何解决-百度请谈一下AQS,为什么AQS的底层 是CAS + volatile-百度请谈一下你对volatile的理解-美团阿里volatile的可见性和禁止指令重排序是如何实现的-美团CAS是什么-美团请描述一下...原创 2020-04-04 21:36:14 · 2110 阅读 · 0 评论 -
Java虚拟机(JVM)字节码指令表
字节码 助记符 指令含义 0x00 nop None 0x01 aconst_null 将null推送至栈顶 0x02 iconst_m1 将int型-1推送至栈顶 0x03 iconst_0 将int型0推送至栈顶 0x04 iconst_1 将int型1推送至栈顶 0x05 iconst_2...原创 2020-04-03 09:19:45 · 3896 阅读 · 0 评论 -
最新版JDK17下的JVM类加载器原理详解
1 类加载器在类加载器家族中存在权力等级制度:1.1 Bootstrap由C/C++实现,启动类加载器,属最高层,JVM启动时创建,通常由与os相关的本地代码实现,是最根基的类加载器。没有对应的Java对象,因此在Java中只能用null来指代。JDK8 时需要注意的是,Bootstrap ClassLoader智慧加载特定名称的类库,比如rt.jar.这意味我们自定义的jar扔到<JAVA_HOME>\jre\lib也不会被加载.负责将:<JAVA_ HOME>原创 2020-04-01 17:19:36 · 4644 阅读 · 0 评论 -
Java对象的序列化/反序列化原理及源码解析
0 前言全是干货的技术殿堂文章收录在我的 GitHub 仓库,欢迎Star/fork:Java-Interview-Tutorialhttps://github.com/Wasabi1234/Java-Interview-TutorialWhatJava序列化是指把Java对象保存为二进制字节码的过程,Java反序列化是指把二进制码重新转换成Java对象的过程。那么为什么需要序列...原创 2020-03-31 23:08:09 · 2083 阅读 · 2 评论 -
全网最全JDK1~JDK15十一种JVM垃圾收集器的原理总结
HotSpot虚拟机提供了多种垃圾收集器,每种收集器都有各自的特点,没有最好的垃圾收集器,只有最适合的垃圾收集器.我们可以根据自己实际的应用需求选择最适合的垃圾收集器.根据新生代和老年代各自的特点,我们应该分别为它们选择不同的收集器,以提升垃圾回收效率.1 Serial垃圾收集器单线程只会使用一个CPU或一条GC线程进行垃圾回收,并且在垃圾回收过程中暂停其他所有的工作线程,从而用户的请求...原创 2020-03-24 21:08:32 · 6992 阅读 · 20 评论 -
Java服务器宕机解决方法论
1 宕机概要1.1 定义一般我们认为向服务器的请求都没有响应或者响应非常缓慢的情况都称为宕机.表面的前端崩溃并不是宕机1.2 分类进程闪退内部崩溃外部终止线程锁死或者无限等待内存溢出下面分别进行详解2 进程闪退2.1 内部崩溃JVM 发生内部崩溃,那么必然会生成"hs_err_pid"开头的文件,下面讲一种常见情况:无法申请内存,显示commit_mem...原创 2020-02-29 03:27:17 · 15624 阅读 · 14 评论 -
Jprofile解析dump文件使用详解
This snapshot did not have its heap dump analysis cached next to the snapshot file.You can use the “jpanalyze” command line utility to pre-analyze snapshots that were taken in offline mode in order ...原创 2020-02-29 03:25:17 · 8098 阅读 · 3 评论 -
JVM参数调优基础-参数的类型详解
1 参数类型1.1 标准参数-help-server -client-version -showversion-cp -classpath1.2 X 参数非标准化参数-Xint :解释执行-Xcomp :第一次使用就编译成本地代码-Xmixed :混合模式, JVM自己来决定是否编译成本地代码JDK8默认混合模式1.3 XX 参数非标转化参数,...原创 2020-02-16 23:58:46 · 2496 阅读 · 2 评论 -
JVM源码实战 - 对象头
JVM是由一个对应角色的oop对象来描述Java对象instanceOopDesc用来描述普通实例对象arrayOopDesc用来描述数组对象这些类型的oop对象均是继承自oopDesc。oopDesc主要包含_mark_mark是一个markOop实例,它描述了一个对象的头信息,用于存储对象的运行时记录信息,如哈希值、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间...原创 2019-11-28 01:32:23 · 1886 阅读 · 0 评论