JVM
文章平均质量分 83
1.JVM类加载机制
2.JVM内存模型与优化
3.JVM内存分配
4.JVM字节码文件结构
5.ParNew&CMS与底层三色标记算法以及G1&ZGC
6.调优工具详解及调优实战
7.JVM调优实战及常量池
8.设计一秒堆溢出的程序从而理解JVM底层运行原理
Java程序员廖志伟
《Java项目实战—深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)作者、(CSDN、51CTO、阿里云)博主专家,研究过Spring、SpringBoot、Spring MVC、SpringCloud、Mybatis、Dubbo、Zookeeper、RabbitMQ、RocketMQ、Kafka、Redis、MySQL、 ElasticSearch、MongoDB、ShardingSphere、DDD、Kubernetes等技术,不定期分享高并发、高可用、高性能、微服务、分布式、海量数据、性能调优、云原生、项目管理、产品思维、技术选型、架构设计、求职面试、副业思维、个人成长等内容。
展开
-
垃圾回收器、垃圾回收算法、空间分配担保、JVM调优、GC回收对象的过程
一个对象的GC年龄,是存储在对象头里面的,一个Java对象在JVM内存中的布局由三个部分组成,分别是对象头、实例数据、对齐填充。而对象头里面有4个bit位来存储GC年龄。4个bit位能够存储的最大数值是15,所以从这个角度来说,JVM分代年龄之所以设置成15次是因为它最大能够存储的数值就是15。虽然JVM提供了参数来设置分代年龄的大小,但是这个大小不能超过15。从设计角度来看,当一个对象触发了最大值15次gc,还没有办法被回收,就只能移动到old generation了。原创 2023-10-18 08:15:00 · 429 阅读 · 0 评论 -
【10个OOM异常的场景以及对应的排查经验】
3)使用工具如 Eclipse Memory Analyzer 和 VisualVM 进行内存分析,找出内存泄漏的根本原因。2)使用 Java 内置工具 jstack 分析线程转储文件,找出执行时间过长的线程,进行优化。3)使用线程池等技术进行线程管理,限制线程池大小并拒绝过多的任务提交。3)使用应用服务器等技术,将应用程序部署到多个服务器上,进行负载均衡。应用程序在读取大文件时,将文件全部读取到内存中,导致内存不足。1)使用 JVM 参数监测工具,监测 JVM 参数配置。原创 2023-09-22 20:09:25 · 242 阅读 · 1 评论 -
【JVM线上调优】
经过排查,小明发现是JVM的内存使用过高,导致频繁触发垃圾回收,从而影响系统的性能。总的来说,通过对JVM内存使用情况、堆大小、GC策略、线程使用情况和运行时信息进行监控,可以在实际应用程序运行中进行针对性的优化,从而提高Java应用程序的性能和稳定性。最后,小明还对JVM进行了一些高级调优,如使用JVM调优工具进行监控、分析程序的内存使用情况,并进行了一些细节的调整,如调整JVM的GC触发时间等。通过监控内存使用情况,可以了解应用程序的内存状况,并且调整JVM的参数,使之更好地适应应用程序的需求。原创 2023-06-16 12:15:00 · 434 阅读 · 0 评论 -
【方法调用(解析与分派)】
在调用obj2.method()时,由于obj2的类型是B,因此需要通过动态解析和动态分派来确定要调用B类中的method方法。而服务员和厨师的协作需要根据每道菜的不同,让相应的厨师根据自己的技能和经验来制作,JVM中也需要根据方法具体的实现来执行方法,这个过程称为分派。例如,如果程序中有一个方法调用obj.method(arg1),并且obj的类型是A类,那么编译器在编译时就可以确定要调用哪个版本的A类中的method方法。方法调用是指在程序运行时,程序通过方法名来执行这个方法的过程。原创 2023-06-14 12:15:00 · 464 阅读 · 0 评论 -
【方法返回地址】
当程序调用一个方法时,JVM会将返回地址保存在栈中,等待方法执行完毕后返回到之前的位置。Java虚拟机中的方法返回地址(Return Address)是指一个方法在执行到return语句时,需要跳转到调用该方法的位置继续执行。总的来说,方法返回地址是Java虚拟机在执行方法时动态生成的,用于保存当前方法返回时需要跳转的位置。在Java虚拟机中,方法返回地址的保存和恢复是通过栈帧实现的。在上述代码中,main方法调用add方法,add方法计算a和b的和,并将结果返回到调用add方法的位置。原创 2023-06-13 12:15:00 · 285 阅读 · 0 评论 -
【动态连接】
他使用了JVM提供的ClassLoader类来动态加载并连接数据库类,这样当应用程序运行时,它只会在需要时才会加载数据库类,从而提高了应用程序的效率和灵活性。通过这个小故事,我们可以理解JVM动态连接的实现原理:在应用程序运行时,ClassLoader会根据需要动态地加载类文件,并将其连接到当前的JVM中,从而实现了动态连接的功能。在这个自定义类加载器中,我们重写了loadClass和findClass方法,实现了对特定包名下的类进行自定义的类加载。下面我们通过一个简单的案例来说明JVM的动态连接过程。原创 2023-06-18 15:15:00 · 760 阅读 · 0 评论 -
【栈帧局部变量表】
在JVM中,每个方法都会在栈上创建一个栈帧(Stack Frame),其中包含了当前方法的局部变量表(Local Variable Table)。在方法执行期间,局部变量表的大小保持不变,并且每个局部变量都占用一个固定的位置。在Java中,局部变量和参数都是在方法栈帧的局部变量表中存储的。当一个方法被调用时,JVM会为该方法创建一个新的栈帧,并将局部变量表分配给该栈帧。局部变量表是栈帧中的一个重要部分,它用于存储当前方法中定义的局部变量。在方法中,参数被存储在局部变量表中,并且一个局部变量被赋值。原创 2023-06-16 08:45:00 · 239 阅读 · 0 评论 -
【虚拟机字节码执行引擎】
虚拟机通过将Java代码编译成字节码,再由字节码执行引擎将字节码一条一条地解释执行,最终实现了在不同机器上运行Java程序的统一性。通过这个小故事,我们可以了解到,虚拟机字节码执行引擎是Java虚拟机的重要组成部分,它负责将编译后的Java代码转化为可执行的机器码,从而保证了Java程序的跨平台性和可移植性。在实际的Java虚拟机中,字节码执行引擎会执行更多的优化和额外的安全检查,以保证Java程序的正确性和性能。小明的朋友告诉他,这是因为不同的机器有着不同的硬件和操作系统,导致程序的运行结果会有所不同。原创 2023-06-16 08:45:00 · 120 阅读 · 0 评论 -
【 class文件结构】
小明学习了JVM的class文件结构后,他能够更深入地理解Java代码的执行过程,也可以更好地优化代码和调试程序,让他成为了一位优秀的Java开发人员。小明用心地学习,发现class文件是二进制格式,包含了Java代码被编译后的字节码,也就是JVM可识别的指令。文件,然后用反编译工具查看类信息中的内容,可以看到类的名称为HelloWorld,父类为。文件中一个重要的部分,它包含了类、方法、接口中使用到的常量,如字符串、数字等。类信息包括了类的名称、父类、接口、字段、方法等信息,它们都存储在。原创 2023-06-15 08:45:00 · 383 阅读 · 0 评论 -
【内存泄漏与溢出】
内存泄漏指程序一直在占用内存,导致无法继续使用,而内存溢出则是超过了内存可用容量,导致程序无法继续运行。因此,程序员需要在编写代码时时刻注意内存的使用情况,及时释放无用的对象,避免内存泄漏和溢出的问题的发生。内存泄漏是指程序中的对象在使用完之后,由于某些原因,不能被垃圾回收机制所回收,导致程序的内存占用不断增加,最终导致程序性能下降乃至崩溃的现象。上述是几种常见的内存泄漏和溢出的情况及其解决方案,JVM中的内存管理机制非常重要,开发人员应当注意内存泄漏和溢出的情况,从而保证程序的性能和稳定性。原创 2023-06-14 08:45:00 · 394 阅读 · 0 评论 -
【逃逸分析】
逃逸分析是一种在运行时分析对象的生命周期和作用域的技术,通过确定对象是否会逃逸到方法之外,可以决定是否将对象分配在堆上,还是分配在栈上。需要注意的是,逃逸分析并不是绝对准确的,无法处理所有情况。根据输出的日志信息,我们可以看到这些对象并没有逃逸,都是在方法中被使用的,因此可以被优化为栈上分配,从而提高程序的性能。逃逸分析是一个在Java虚拟机中进行的技术,它可以识别对象在整个程序中的生命周期,以便优化对象的创建和回收。通过逃逸分析,小明成功提高了程序的执行效率,减少了内存的占用,并解决了程序出现的错误。原创 2023-06-13 08:45:00 · 422 阅读 · 0 评论 -
【强软弱虚引用】
四种引用类型各有优缺点,使用时需要根据具体场景来选择。强引用是最常用的一种引用类型,但如果使用不当,会造成内存泄漏等问题。软引用和弱引用更加智能,可以避免内存泄漏,但对象的生命周期较短,可能会导致缓存被频繁清理。虚引用则更加灵活,可以跟踪对象的垃圾回收过程,但使用起来较为复杂。原创 2023-06-14 08:00:00 · 105 阅读 · 0 评论 -
【可达性分析】
就像John授权给Jane使用他的钥匙,当Jane还钥匙给John时,表示John仍然需要这个钥匙使用,而Jim的钥匙没有人使用,因此可达性分析会认为Jim已经没有用了,会将他的钥匙回收。JVM 的可达性分析是 Java 虚拟机自动进行垃圾回收的一种技术,其基本思路是通过一系列的“GC Roots”对象作为起始点,从这些根对象开始向下搜索,搜索到的对象称为“可达对象”,而没有搜索到的对象则认为是“不可达对象”,即可以进行垃圾回收。他们的房子都是相邻的,每个人都有一把钥匙来打开自己的房门。原创 2023-06-13 08:00:00 · 271 阅读 · 0 评论 -
故事会【JVM内存模型】
当一个线程调用一个方法时,JVM 会在该线程的虚拟机栈上为这个方法创建一个栈帧。在 JVM 的内存模型中,每个线程都有自己的程序计数器和栈,就像每个公民都有自己的家和生活方式一样。JVM 的内存管理机制会负责分配和回收这些对象,就像国王管理着这个国家的资源一样。当这个对象不再被任何线程引用时,JVM 就会自动回收它的内存,就像国王会让资源重新得到利用一样。总的来说,JVM 的内存模型是 Java 程序运行的基础,它帮助我们更好地理解和控制 Java 程序的运行。原创 2023-06-06 07:50:09 · 54 阅读 · 0 评论 -
JVM篇【Java源文件和Class字节码文件对比】
在分析JVM相关知识之前,给大家分享一段代码,非常通俗易懂的代码。代码如下:package com.test.util;import java.io.Serializable;public class Test implements Serializable { private static String name = "JVM"; public static void main(String[] args) { System.out.println(name原创 2022-04-01 22:05:29 · 2488 阅读 · 12 评论 -
【JVM我可以讲一个小时】
有很多博客中都会对JVM类加载过程进行表述,一般都是说先加载,后连接,连接里面包含验证,验证里面包含,文件格式验证,元数据验证,字节码验证,符号引用验证,然后就是准备,解析,然后初始化,使用,卸载。但是目前我看到的一些权威的数据并没有这样的描述,我认为这个流程,应该是,第一步,加载,第二步,验证,第三步,加载,第四步,加载,第五步,验证,第六步,准备,第七步,初始化。为啥没说解析,因为解析是在初始化之前,具体哪一步,其实我们是不清楚的,也不是固定的。原创 2022-02-20 15:10:40 · 2146 阅读 · 47 评论 -
【JVM】
本文详解HotspotJVM后台运行的线程,JVM内存区域,垃圾回收与算法,GC分代与分区算法,GC垃圾收集器,JMM内存模型,CAS,ABA,四大引用,JVM调优原创 2022-01-11 18:58:20 · 862 阅读 · 12 评论 -
【JVM参数调优】
我是廖志伟,一名Java开发工程师、Java领域优质创作者、CSDN博客专家、幕后大佬社区创始人。拥有多年一线研发经验,研究过各种常见框架及中间件的底层源码,对于大型分布式、微服务、三高架构(高性能、高并发、高可用)有过实践架构经验。原创 2021-12-04 10:01:57 · 1430 阅读 · 0 评论 -
【GC 垃圾收集器】
我是廖志伟,一名Java开发工程师、幕后大佬社区创始人、Java领域优质创作者、CSDN博客专家。拥有多年一线研发经验,研究过各种常见框架及中间件的底层源码,对于大型分布式、微服务、三高架构(高性能、高并发、高可用)有过实践架构经验。原创 2021-12-03 10:08:52 · 733 阅读 · 0 评论 -
【JAVA 四中引用类型】
我是廖志伟,一名Java开发工程师、幕后大佬社区创始人、Java领域优质创作者、CSDN博客专家。拥有多年一线研发经验,研究过各种常见框架及中间件的底层源码,对于大型分布式、微服务、三高架构(高性能、高并发、高可用)有过实践架构经验。原创 2021-12-03 10:06:23 · 1324 阅读 · 0 评论 -
【GC 分代收集算法 VS 分区收集算法】
我是廖志伟,一名Java开发工程师、幕后大佬社区创始人、Java领域优质创作者、CSDN博客专家。拥有多年一线研发经验,研究过各种常见框架及中间件的底层源码,对于大型分布式、微服务、三高架构(高性能、高并发、高可用)有过实践架构经验。原创 2021-12-02 18:03:02 · 823 阅读 · 0 评论 -
【垃圾回收与算法】
我是廖志伟,一名Java开发工程师、幕后大佬社区创始人、Java领域优质创作者、CSDN博客专家。拥有多年一线研发经验,研究过各种常见框架及中间件的底层源码,对于大型分布式、微服务、三高架构(高性能、高并发、高可用)有过实践架构经验。垃圾回收与算法如何确定垃圾引用计数法可达性分析GC算法标记清除算法(Mark-Sweep)复制算法(copying)标记整理算法(Mark-Compact)分代收集算法新生代与复制算法老年代与标记复制算法本文的大概内.原创 2021-12-01 18:01:56 · 380 阅读 · 0 评论 -
【JVM内存区域】
我是廖志伟,一名Java开发工程师、幕后大佬社区创始人、Java领域优质创作者、CSDN博客专家。拥有多年一线研发经验,研究过各种常见框架及中间件的底层源码,对于大型分布式、微服务、三高架构(高性能、高并发、高可用)有过实践架构经验。博主:java_wxid社区:幕后大佬文章目录JVM内存区域程序计数器(线程私有)虚拟机栈(线程私有)本地方法区(线程私有)堆(Heap-线程共享)-运行时数据区新生代Eden区ServivorFrom区ServivorTo区MinorGC 的过程(复制->清.原创 2021-11-30 08:46:14 · 710 阅读 · 17 评论 -
【HotspotJVM后台运行的系统线程】
我是廖志伟,一名Java开发工程师、幕后大佬社区创始人、Java领域优质创作者、CSDN博客专家。拥有多年一线研发经验,研究过各种常见框架及中间件的底层源码,对于大型分布式、微服务、三高架构(高性能、高并发、高可用)有过实践架构经验。博主:java_wxid社区:幕后大佬文章目录HotspotJVM后台运行的系统线程本文的大概内容:HotspotJVM后台运行的系统线程JVM 允许一个应用并发执行多个线程。Hotspot JVM 中的 Java线程与原生操作系统线程有直接的映射关系.原创 2021-11-29 11:47:00 · 396 阅读 · 14 评论 -
【类加载机制深度解析】
Java 执行代码流程图:解释:启动虚拟机 (C++负责创建) 【windows : bin/java.exe调用 jvm.dll Linux : java 调用 libjvm.so 】 创建一个引导类加载器实例 (C++实现) C++ 调用Java代码,创建JVM启动器,实例sun.misc.Launcher 【这货由引导加载器负责加载创建其他类加载器】 sun.misc.Launcher.getLauncher() 获取运行类自己的加载器ClassLoader --> 是AppCl.原创 2020-08-15 16:37:39 · 2219 阅读 · 23 评论 -
【设计一个刚好在一秒堆溢出的程序】
创建了一个JVMDemo类:package common;import java.lang.management.ManagementFactory;import java.lang.management.MemoryMXBean;import java.util.ArrayList;import java.util.List;/** * @Author:Liaozhiwei...原创 2019-11-23 17:13:55 · 5028 阅读 · 68 评论