jvm
文章平均质量分 79
jvm
秃了也弱了。
即使没有万全准备,也要勇敢迈出第一步。无论远方的风雨有多大、路有多难走。风里雨里陪伴你们,赠人玫瑰,手有余香。在技术领域,我会一如既往的坚持下去。
展开
-
JIT即时编译器深度解析——Java性能提升利器
Java程序在运行的时候,主要就是执行字节码指令,一般这些指令会按照顺序解释执行,这种就是解释执行。但是那些被频繁调用的代码,比如调用次数很高或者在 for 循环里的那些代码,如果按照解释执行,效率是非常低的。(这个就是Java以前被C、C++开发者吐槽慢的原因)以上的这些代码称为热点代码。所以,为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化。原创 2023-12-12 16:23:01 · 719 阅读 · 1 评论 -
新一代垃圾收集器:ZGC深度剖析,到底什么时候用?
支持TB量级的堆。我们生产环境的硬盘还没有上TB呢,这应该可以满足未来十年内,所有JAVA应用的需求了吧。最大GC停顿时间不超10ms。目前一般线上环境运行良好的JAVA应用Minor GC停顿时间在10ms左右,Major GC一般都需要100ms以上(G1可以调节停顿时间,但是如果调的过低的话,反而会适得其反),之所以能做到这一点是因为它的停顿时间主要跟Root扫描有关,而Root数量和堆大小是没有任何关系的。奠定未来GC特性的基础。最糟糕的情况下吞吐量会降低15%。原创 2023-12-08 08:37:54 · 1533 阅读 · 0 评论 -
还在对java类、类的加载一知半解?这篇文章相信会解决你80%的困惑
什么是Class类 在Object类中定义了以下的方法,此方法将被所有子类继承: public final Class getClass(); 以上的方法返回值的类型是一个Class类,此类是Java反射的源头,实际上所谓反射从程序的运行结果来看也很好理解,即:可以通过对象反射求出类的名称。 注意:一个类只有唯一对应的一个Class类!public class Test01 { public static void main(String[] a...原创 2020-08-23 21:22:49 · 6283 阅读 · 0 评论 -
java对象创建的流程到底是什么样子的?new一个对象是真的直接放在堆里吗?其实大有学问!
目录对象创建流程图总结逃逸分析什么是逃逸分析?对象逃逸状态逃逸分析优化TLAB区对象如何进入老年代有问题可以直接留言讨论~对象创建流程图 1.编译器通过逃逸分析,确定对象是在栈上分配还是在堆上分配。如果是在堆上分配,则进入选项2. 2.如果tlab_top + size <= tlab_end,则在在TLAB上直接分配对象并增加tlab_top 的值,如果现有的TLAB不足以存放当前对象则3. 3.重新申请一个TLAB,并再次尝试存...原创 2020-08-26 17:41:37 · 6225 阅读 · 2 评论 -
揭开volatile的神秘面纱——熟悉volatile 的内存语义
当声明共享变量为 volatile 后,对这个变量的读/写将会很特别。为了揭开 volatile 的神秘面纱,本文将介绍 volatile 的内存语义及 volatile 内存语义的实现。原创 2022-08-15 23:30:00 · 294 阅读 · 0 评论 -
jvm性能监控、故障处理命令行工具详解(jps、jstat、jinfo、jmap、jhat、jstack)(宝藏博文)
所有的java命令都可以使用-help或者-option查看帮助、选项,类似于linux系统命令的–help。注!其中大部分命令在jdk9中被集成到了jhsdb命令中了!原创 2022-08-11 22:15:00 · 900 阅读 · 0 评论 -
happens-before规则——理解happens-before规则
happens-before 是 JMM 最核心的概念。对应 Java 程序员来说,理解 happens-before是理解 JMM 的关键。从 JDK 5 开始,Java 使用新的 JSR-133 内存模型(除非特别说明,本文针对的都是JSR-133 内存模型)。JSR-133 使用 happens-before 的概念来阐述操作之间的内存可见性。在 JMM 中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必 须要存在 happens-before 关系。...原创 2022-08-11 09:02:36 · 1506 阅读 · 0 评论 -
依据CPU的三级缓存来解释可见性、有序性——真正的底层
我们都知道,volatile解决了变量的可见性,保证了有序性,禁止了指令重排序。那么,它是怎么做到的呢?什么是内存的可见性?CPU对指令为什么会重排序?今天全给你讲明白!(不熟悉volatile的同学们,请看这个:volatile超详细讲解)一个java进程执行的过程:打开进程(java程序) -> 将进程需要执行的main程序加载到内存中 -> 将指令加载到PC寄存器,将数据加载到Registers,ALU计算组做计算 ->计算完毕将结果写回内存。以上是单线程执行的 过程,那么多线程执行过程呢?原创 2022-06-17 18:27:34 · 829 阅读 · 1 评论 -
jps无法查看到已经运行的java进程(已解决)
jps类似linux的ps命令,不同的是ps是用来显示进程,而jps只显示java进程,准确的说是当前用户已启动的部分java进程信息,信息包括进程号和简短的进程command。用ps -ef|grep java能看到启动的java进程,但是用jps查看却不存在该进程的id。生产项目jvm内存剧增,想分析一下jvm内存,使用jps无法查看到进程,令人百思不得其解。在此记录一下为何jps看不到java的进程。java程序启动后,默认(请注意是默认)会在/tmp/hsperfdata_userName目录下以原创 2022-06-16 19:45:00 · 5272 阅读 · 6 评论 -
使用jprofile做jvm内存分析之jprofile安装
本文只做jprofile的安装。链接:https://pan.baidu.com/s/1rhE5xD_57MXWhwEHV2m0ww提取码:e3mm自己选取要下载的版本。(压缩包内有生成秘钥工具可破解)安装重启idea安装完成后,在idea这个位置会出现jprofile的图标,点击即可运行。具体使用方式此处略。...原创 2022-06-16 09:21:24 · 749 阅读 · 4 评论 -
java加载一个来自项目之外的java文件,执行其main方法的一种实现方式
java加载一个来自项目之外的java文件,执行其main方法的一种实现方式原创 2022-03-23 14:54:03 · 1606 阅读 · 0 评论 -
java使用jstat分析内存
使用方式1.jps命令显示当前所有正在运行的java程序2.jstat -[options] 程序进程号jstat命令命令格式jstat [Options] vmid [interval] [count]命令参数说明Options,一般使用 -gcutil 或-gc 查看gc 情况pid,当前运行的 java进程号interval,间隔时间,单位为秒或者毫秒count,打印次数,如果缺省则打印无数次Options 参数如下:-gc:统计 jdk gc...原创 2022-02-17 17:05:28 · 335 阅读 · 0 评论 -
JVM常用启动参数大全(附带解释)
目录一、官网二、堆相关三、方法区相关四、执行引擎相关五、垃圾回收相关六、内存分配与垃圾回收的参数列表一、官网官网说明:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html查看jvm启动参数:jinfo -flag NewRatio pid二、堆相关-XX:+PrintFlagsInitial:查看所有的参数的默认初始值-XX:+PrintFlagsFinal:查看所有的参数的最终原创 2022-01-10 17:59:50 · 1274 阅读 · 0 评论 -
java类加载器、双亲委派、沙箱安全机制全都让你整明白(三万字,收藏慢慢啃)
java类加载器、双亲委派、打破双亲委派、沙箱安全、自定义类加载器等。三万字长文建议收藏慢慢啃原创 2021-11-25 22:30:50 · 2266 阅读 · 0 评论 -
java类的完整生命周期详解
目录一、概述二、过程一:Loading(加载)阶段1、加载完成的操作(1)加载的理解(2)加载完成的操作2、二进制流的获取方式3、类模型与Class实例的位置(1)类模型的位置(2)Class实例的位置(3)图示(4)再说明4、数组类的加载三、过程二:Linking(链接)阶段1、环节1:链接阶段之Verification(验证)整体说明:具体说明:2、环节2:链接阶段之Preparation(准备)3、环节3:链接阶段之Resolut原创 2021-11-18 21:54:43 · 1656 阅读 · 0 评论 -
带你看明白class二进制文件!
一、虚拟机的基石:Class文件1.字节码文件里是什么? 源代码经过编译器编译之后便会生成一个字节码文件,字节码是一种二进制的类文件,它的内容是JVM的机器码指令,而不像C、C++经由编译器直接生成机器码。2.什么是字节码指令(bytecode)? Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的操作码(opcode)以及跟随其后的零至多个代表此操作的所需参数的操作数(operand)所构成。虚拟机中许多指令并不包含操作数,只有一个操作码。...原创 2021-08-24 14:49:35 · 2189 阅读 · 0 评论 -
JVM垃圾回收器详细解读(吐血整理,建议收藏)
目录一、GC分类垃圾回收器概述垃圾回收器分类二、评估GC的性能指标吞吐量(throughput)暂停时间(pause time)吞吐量VS暂停时间三、不同的垃圾回收器概述垃圾收集器发展史7款经典的垃圾收集器7款经典收集器与垃圾分代之间的关系垃圾收集器组合关系如何查看默认的垃圾回收器四、Serial回收器:串行回收总结五、ParNew回收器:并行回收(处境比较尴尬,基本不用了,新版本没有与之对应的老年代回收器了)六、Parallel回收器:吞原创 2021-08-21 08:12:39 · 1577 阅读 · 0 评论 -
使用MAT做jvm的GC Roots溯源
MAT是MemoryAnalyzer的简称,它是一款功能强大的Java堆内存分析器。用于查找内存泄漏以及查看内存消耗情况。 MAT是基于Eclipse开发的,是一款免费的性能分析工具。 http://www.eclipse.org/mat/可下载并使用MAT。使用MAT1.获取dump文件(bin文件)方式一:命令行使用jmap方式二:使用JVisualVM导出 捕获的heapdump文件是一个临时文件,关闭JVisualVM后自...原创 2021-08-02 09:58:01 · 399 阅读 · 0 评论 -
使用JProfiler查看GC Roots
目录安装查看gcroots安装1.建议装Jprofiler 112.idea装插件,直接搜索Jprofiler3.启动查看gcroots原创 2021-08-02 09:31:25 · 1031 阅读 · 0 评论 -
java-垃圾回收的并行与并发
目录并发(Concurrent)并行(Parallel)并发vs并行垃圾回收的并发与并行并发(Concurrent)1.在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理器上运行。2.并发不是真正意义上的“同时进行”,只是CPU把一个时间段划分成几个时间片段(时间区间),然后在这几个时间区间之间来回切换,由于CPU处理的速度非常快,只要时间间隔处理得当,即可让用户感觉是多个应用程序同时在进行。并行(Parall..原创 2021-08-02 09:28:07 · 844 阅读 · 0 评论 -
java垃圾回收算法超详细全解
目录一、开始垃圾标记阶段:对象存活判断垃圾清除阶段二、垃圾标记阶段算法——引用计数法循环引用证明java未使用引用计数算法小结三、垃圾标记阶段算法——可达性分析算法(根搜索算法、追踪性垃圾收集)基本思路GCRoots有哪些小技巧注意四、对象的finalization机制对象——生存还是死亡?具体过程证明finalize()方法只能被调用一次,以及对象“复活”五、垃圾清除阶段算法——标记-清除算法背景执行过程缺点注意:何为清.原创 2021-08-02 09:25:36 · 1685 阅读 · 0 评论 -
java强引用、软引用、弱引用、虚引用-Java的引用类型总共有四种,你都知道吗
目录谈引用强引用(Strong Reference)——不回收强引用例子软引用(SoftReference)——内存不足即回收弱引用(WeakReference)——发现即回收面试题:你开发中使用过WeakHashMap吗?虚引用(PhantomReference)——对象回收跟踪终结器引用(Finalreference)谈引用1.我们希望能描述这样一类对象:当内存空间还足够时,则能保留在内存中;如果内存空间在进行垃圾收集后还是很紧张,则可以抛弃这些对象。...原创 2021-08-02 09:06:46 · 686 阅读 · 0 评论 -
jvm-垃圾回收随时都可以STW吗?带你认识安全点和安全区域
目录安全点如何在GC发生时,检查所有线程都跑到最近的安全点停顿下来呢?安全区域(SafeRegion)实际执行时安全点1.程序执行时并非在所有地方都能停顿下来开始GC,只有在特定的位置才能停顿下来开始GC,这些位置称为“安全点(Safepoint)”。2.SafePoint的选择很重要,如果太少可能导致GC等待的时间太长,如果太频繁可能导致运行时的性能问题。大部分指令的执行时间都非常短暂,通常会根据“是否具有让程序长时间执行的特征”为标准。比如:选择一些执行时间较长的指令作为..原创 2021-08-02 08:58:19 · 676 阅读 · 0 评论 -
认识java-STW:Stop the World
1.Stop-the-World,简称STW,指的是GC事件发生过程中,会产生应用程序的停顿。停顿产生时整个应用程序线程都会被暂停,没有任何响应。有点像卡死的感觉,这个停顿成为STW。 可达性分析算法中枚举根节点(GCRoots)会导致所有Java执行线程停顿。 (1)分析工作必须在一个能确保一致性的快照中进行。 (2)一致性指整个分析期间整个执行系统看起来像被冻结在某个时间点上。 (3)如果出现分析过程中对象引用关系还在不断变化,则分析结果的准确性无法保证。...原创 2021-08-02 08:56:00 · 794 阅读 · 0 评论 -
java-内存溢出与内存泄漏
目录内存溢出(OOM)内存泄漏(MemoryLeak)内存溢出(OOM)1.内存溢出相对于内存泄漏来说,尽管更容易被理解,但是同样的,内存溢出也是引发程序崩溃的罪魁祸首之一。2.由于GC一直在发展,所有一般情况下,除非应用程序占用的内存增长速度非常快,造成垃圾回收已经跟不上内存消耗的速度,否则不太容易出现OOM的情况。3.大多数情况下,GC会进行各种年龄段的垃圾回收,实在不行了就放大招,来一次独占式的FullGC操作,这时候会回收大量的内存,供应用程序继续使用。4.javad..原创 2021-08-02 08:55:02 · 775 阅读 · 0 评论 -
java的System.gc()的理解
目录什么是System.gc()实例1实例2什么是System.gc()1.在默认情况下,通过System.gc()或者Runtime.getRuntime().gc()的调用,会显式触发FullGC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。2.然而,System.gc()调用附带一个免责声明,无法保证对垃圾收集器的调用。3.JVM实现者可以通过System.gc()调用来决定JVM的GC行为。而一般情况下,垃圾回收应该是自动进行的,无须手动触发,否则就太过.原创 2021-08-02 08:53:06 · 1016 阅读 · 0 评论 -
String的Intern()方法,详解字符串常量池!
目录一、String的基本特性为什么jdk9String由char[]改为了byte[]去存?String存储结构发生了变更,StringBuffer和StringBuilder是否改变了?实例(因为String不可变性,原来地址的值是无法被改变的):二、String的内存分配为什么要将StringTable进行调整,从永久代->堆?三、String的基本操作实例1:实例2:四、字符串拼接操作实例1:(常量与常量的拼接结果在常量池)实例2:(拼接其中有一原创 2021-07-18 16:44:21 · 2103 阅读 · 11 评论 -
jvm执行引擎全解,java解释器即时编译器,全都讲明白
目录一、开局一张图二、执行引擎概述三、执行引擎工作过程java代码编译和执行的过程问题:什么是解释器(Interpreter),什么是JIT编译器?问题:为什么说java是半编译半解释型语言?四、机器码、指令、汇编语言等概念机器码指令指令集汇编语言高级语言字节码C、C++源程序执行过程:图示,各种语言都可以运行在java虚拟机,只要能编译出字节码文件:图示,java代码处理过程:图示,高级语言执行过程:五、解释器解释器工作机制(或工原创 2021-07-13 17:06:46 · 2078 阅读 · 0 评论 -
对象创建的过程细节是怎样的?一起来探讨内存变化细节
目录一、对象的实例化对象创建的几种方式对象创建的步骤二、对象的内存布局三、对象的访问定位JVM是如何通过栈帧中的对象引用访问到其内部的对象实例呢?1.句柄访问2.直接指针(HotSpot采用这种方式)一、对象的实例化对象创建的几种方式1.new关键字。 (1)直接newXxx() (2)调用Xxx的静态方法,返回一个新建的对象。 (3)XxxBuilder/XxxFactory使用工厂模式获取对象。2.Class的newInst...原创 2021-07-09 15:43:56 · 1584 阅读 · 0 评论 -
java方法区超详细汇总,方法区到底是干什么用的?不懂方法区不能说了解jvm!
目录一、运行时数据区结构图二、栈、堆、方法区的交互关系三、方法区的理解官方文档方法区在哪里方法区的基本理解HotSpot中方法区而定演进四、设置方法区大小与OOM设置方法区内存的大小代码举例1代码举例2如何解决这种OOM?五、方法区的内部结构方法区(MethodArea)存储什么?方法区的内部结构类型信息:域(Field)(属性)信息:方法(Method)信息:non-final的类变量全局常量(static+final).原创 2021-07-08 11:04:22 · 8684 阅读 · 6 评论 -
史上最全java堆,将知识点掰碎了给你嚼,还不信学不会。
目录一、开局一张图二、堆的核心概述(注意“可能”、“几乎”这几个关键字,后面会谈到)举例三、堆的内存细分结构1.现在垃圾收集器大部分都基于分代收集理论设计,堆空间细分为:2.堆空间内部结构(-Xmx也只应用于新生代和老年代)四、设置堆内存大小五、OOM举例六、年轻代和老年代配置新生代与老年代在堆结构的占比七、对象分配过程对象分配过程概述总结对象分配特殊情况对象分配过程演示八、MinorGC、MajorGC与FullGC最简单的分代式G...原创 2021-07-05 09:24:56 · 2203 阅读 · 5 评论 -
什么是java本地方法?什么,还没听说过java的native关键字?真的该学学了!
目录开局一张图什么是本地方法?举例为什么要使用NativeMethod现状本地方法栈开局一张图什么是本地方法? 简单地讲,一个NativeMethod就是一个Java调用非Java代码的接口。一个NativeMethod是这样一个Java方法:该方法的实现由非Java语言实现,比如C。这个特征并非Java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以extern“C”告知C++编译器去调用一个C的函数。 “A native met...原创 2021-07-05 08:58:54 · 2198 阅读 · 0 评论 -
class文件反编译-指令字节码对照表
使用javap -c Xxxxx.class可以查看class文件的字节码指令。以下是字节码指令对照表0x00 nop 什么都不做0x01 aconst_null 将null推送至栈顶0x02 iconst_m1 将int型-1推送至栈顶0x03 iconst_0 将int型0推送至栈顶0x04 iconst_1 将int型1推送至栈顶0x05 iconst_2 将int型2推送至栈顶0x06 iconst_3 将int型3推送至栈顶0x07 iconst_4 将int型4推送至..原创 2021-06-28 15:50:20 · 1678 阅读 · 0 评论 -
只知道java有反射可以说是动态语言,动态链接,早期晚期绑定、虚方法这些概念你知道吗
开局一张图动态链接(或指向运行时常量池的方法引用) 每一个栈帧内部都包含一个指向运行时常量池中该栈帧所属方法的引用。包含这个引用的目的就是为了支持当前的方法的代码能够实现动态链接(Dynamic Linking)。比如:invokedynamic指令。 在Java源文件被编译到字节码文件中时,所有的变量和方法引用都作为符号引用(Symbolic Reference)保存在class文件的常量池里(#xx,如下图)。比如:描述一个方法调用了另外的其他方法时,就是通过常量池中指向...原创 2021-06-28 17:22:48 · 1658 阅读 · 1 评论 -
你只知道JVM栈,知不知道栈帧、局部变量表、slot、操作数栈?
目录虚拟机栈基础虚拟机栈出现的背景栈是运行时的单位,而堆是存储的单位Java虚拟机栈栈中可能出现的异常设置Java栈大小栈中存储什么?栈运行原理栈帧的内部结构每个栈帧中存储着局部变量表(Local Variables)(简而言之就是方法内部定义的形参、局部变量值、返回值)代码示例关于slot(槽)的理解Slot的重复利用静态变量与局部变量的对比变量的分类补充说明操作数栈(用数组来实现的)操作数栈+代码解析带返回值的i++和.原创 2021-06-28 17:12:06 · 1700 阅读 · 0 评论 -
jvm运行时数据区是干啥的?CPU切换线程会不会突然忘记程序执行到哪一步了
目录还是那张JVM总体图线程程序计数器(PC寄存器)使用PC寄存器存储字节码指令地址有什么用呢?为什么使用PC寄存器记录当前线程的执行地址呢?PC寄存器为什么会被设定为线程私有?CPU时间片还是那张JVM总体图 内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的JVM对于内存的划分方式和管理机制存在着部分差异。结合JVM虚..原创 2021-06-28 17:01:59 · 1521 阅读 · 2 评论 -
java类是如何加载的?不知道classLoader和双亲委派,不是一个合格的程序员
目录详细图送上类加载器子系统类的加载过程加载(loading)阶段链接(linking) 验证(Verify) 准备(Prepare) 解析(Resolve)初始化(Initialization)类加载器类加载器ClassLoader角色各种类加载器用java获取类加载器虚拟机自带的类加载器启动类加载器(引导类加载器,Bootstrap ClassLoader)扩展类加载器(Extension ClassLoader)应用...原创 2021-06-28 16:31:42 · 1455 阅读 · 0 评论 -
java代码编译之后是如何运行的?不知道这些,面试官问你jvm问题,你只能懵圈
目录从机器语言->汇编语言->高级语言JVM的整体结构java代码执行流程java虚拟机种类(常用的就是HotSpot)从机器语言->汇编语言->高级语言计算机系统体系对我们来说越来越远,在不了解底层实现方式的前提下,通过高级语言很容易编写程序代码。但事实上计算机并不认识高级语言。java就属于高级语言。JVM的整体结构java代码执行流程java代码会进行两次编译,第一次生成class字节码文件,第二次使用JIT编译器将热点代原创 2021-06-28 16:18:10 · 1634 阅读 · 0 评论