
【JVM高级特性】
文章平均质量分 96
JVM高级特性
小小工匠
show me the code ,change the world
展开
-
Java - 引用类型:强引用、软引用、弱引用和虚引用详解
在Java中,内存管理是一个非常重要的主题。Java的垃圾回收机制(Garbage Collection, GC)自动管理内存,但开发者仍然需要了解如何通过引用类型来控制对象的生命周期。Java提供了四种引用类型:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。每种引用类型对垃圾回收的影响不同,适用于不同的场景。原创 2025-02-01 20:58:55 · 2367 阅读 · 0 评论 -
Java - JSR223规范解读_在JVM上实现多语言支持
JSR223(Java Specification Request 223),也称为 Scripting for the Java Platform,是一个Java平台的标准接口,旨在让Java应用程序能够灵活地集成和执行脚本语言。它定义了一种可以在Java应用中嵌入不同脚本语言的统一接口,允许Java程序调用、执行脚本,并且支持将Java对象传递到脚本语言中。Groovy是一个基于Java平台的动态语言,它简洁、表达力强,并且与Java兼容性极高。原创 2024-11-29 21:26:34 · 3557 阅读 · 0 评论 -
JVM-剖析对象内存分配流程
文章目录对象分配流程总览流程分解栈上分配对象 (逃逸分析)对象分配流程总览流程分解栈上分配对象 (逃逸分析)众所周知, JAVA中的对象都是在堆上进行分配,当对象没有被引用的时候,需要GC。如果对象数量较多的时候, GC 压力较大,也间接影响了应用的性能 。为了减少临时对象在堆内分配的数量,JVM通过逃逸分析确定该对象不会被外部访问 . 如果不会逃逸可以将该对象在栈上分配内存,这样该对象所占用的内存空间就可以随栈帧出栈而销毁,从而减轻GC的压力。...原创 2020-06-27 00:19:49 · 14481 阅读 · 0 评论 -
JVM - Class常量池 || 运行时常量池
文章目录Preclass常量池字面量符号引用符号引用PreJVM - 深入剖析字符串常量池JVM - 基本类型的包装类和对象池class常量池Class常量池我们可以理解为是Class文件中的资源仓库。Class文件中主要由两大部分 类的版本、字段、方法、接口等描述信息外,常量池(constant pool table),用于存放编译期生成的各种字面量(Literal)和符号引用(Symbolic References)。我们来看下我们天天打交道的class文件十六进制的样子 大原创 2020-07-13 00:40:27 · 14639 阅读 · 0 评论 -
JVM - 一个案例反推不同JDK版本的intern机制以及intern C++源码解析
文章目录Pre案例JDK1.7(含)+JDK1.6PreJVM - 深入剖析字符串常量池案例 String str2 = new StringBuilder("计算机").append("技术").toString(); System.out.println(str2 == str2.intern()); String s2 = new StringBuilder("计算机技术").toString(); System.out.println(s原创 2020-07-12 00:32:24 · 14156 阅读 · 0 评论 -
JVM - 基本类型的包装类和对象池
文章目录Pre八大基本类型DemoPreJVM - 深入剖析字符串常量池学习了String 字符串常量池。接下来我们也顺便看下基本类型的包装类和起对应的对象池JDK1.8八大基本类型Java基本类型共有八种,基本类型可以分为三类,字符类型char布尔类型boolean数值类型byte、short、int、long、float、doublejava中基本类型的包装类的大部分都实现了常量池技术(严格来说应该叫对象池,在堆上),这些类是Byte,Short,Integer,Long原创 2020-07-11 23:07:17 · 14352 阅读 · 0 评论 -
JVM - 深入剖析字符串常量池
文章目录字符串常量池位置的变更class文件常量池Class常量池字符串常量池位置的变更Jdk1.6及之前: JVM存在永久代, 运行时常量池在永久代,运行时常量池包含字符串常量池Jdk1.7:有永久代,但已经逐步“去永久代”,字符串常量池从永久代里的运行时常量池分离到堆里Jdk1.8及之后: 无永久代,变成了元空间,运行时常量池在元空间,字符串常量池里依然在堆里class文件常量池Class常量池...原创 2020-07-08 15:44:22 · 14620 阅读 · 1 评论 -
JVM - 要上线了,JVM参数还没正儿八经的估算过咋办?
文章目录PrejstatPre如题, 一顿操作猛如虎,业务系统总算快发布了,可是JVM的参数还是当初随意设置的那么几个参数, 咋弄? 系统的流量预估(均值、峰值)导致一系列的评估: 每秒的对象生成大小,新生代 老年代的比例是否合理, 动态年龄判断机制、老年代担保机制会不会被频繁触发,full gc 的频率。。。。留下一脸懵逼的你在风中瑟瑟发抖~不要怕 ,今天我们就来看一下如何通过合理的预估来设置系统的JVM参数JVM-10虚拟机性能监控与故障处理工具之【JDK的命令行】名称英文全原创 2020-07-06 23:57:43 · 14195 阅读 · 0 评论 -
JVM - 列出JVM默认参数及运行时生效参数
文章目录Pre-XX:+PrintFlagsInitial 列出JVM参数的默认值-XX:+PrintFlagsFinal 列出运行程序时生效的值-XX:+PrintCommandLineFlags 列出被用户或者JVM优化设置过的详细的XX参数的名称和值列举附加隐藏参数Pre有的时候,想看下自己没有设置的JVM参数的值, 或者有的时候想看下JVM某个参数的默认值 ,亦或想看下用户或者JVM修改的JVM参数 ?咋办 ?JVM在1.6.0_14以后提供了几个参数可以打印出来所有XX参数和对应的值原创 2020-07-06 16:07:30 · 16004 阅读 · 5 评论 -
JVM - 解读GC中的 Safe Point & Safe Region
文章目录Safe Point 安全点Safe Region 安全区域OopMapSafe Point 安全点思考: 如上图 GC的时候,是不是可以马上GC,而不用去care用户线程 ?答案肯定是不行的。 HotSpot中GC不是在任意位置都可以进入,而只能在safepoint处进入。JVM在设计的时候在“特定位置”记录了OopMap , 而这些位置被称为安全点。Safe Region 安全区域OopMapGC 我们都知道是清理那些引用不可达的对象, 简单来说 JVM怎样才能够判断出所有位原创 2020-07-04 08:18:51 · 15874 阅读 · 1 评论 -
JVM - ZGC初探
文章目录PreZGC概述ZGC的目标参考资料PreJVM - G1初探ZGC概述ZGC是一款JDK 11中新加入的具有实验性质的低延迟垃圾收集器,ZGC源自于是Azul System公司开发的C4(Concurrent Continuously Compacting Collector) 收集器。目前很少有公司使用,可适当了解,扩展知识面。ZGC的目标参考资料https://wiki.openjdk.java.net/display/zgc/Mainhttp://cr.op原创 2020-07-01 16:43:14 · 15049 阅读 · 0 评论 -
JVM - G1初探
文章目录GC概述参考GC概述我们知道Serial 、Serial Old 、 Parallel 、 Parallel Old 、 ParNew 、CMS这些垃圾收集器都是基于分代收集理论,即将内存区域按照存储对象的不同分为年轻带、老年代和元空间。如下G1 和 ZGC 逐渐淡化了这种分代的概念,G1的堆内存分配如下堆被划分为一组大小相等的堆区域,每个堆区域都有一个连续的虚拟内存范围。 这在内存使用方面提供了更大的灵活性。参考https://www.oracle.com/technetwo原创 2020-07-01 06:51:56 · 14319 阅读 · 0 评论 -
JVM - CMS深度剖析
文章目录PreCMSJVM参数阶段PreJVM-04垃圾收集Garbage Collection(上)【垃圾对象的判定】JVM-05垃圾收集Garbage Collection(中)【垃圾收集算法】JVM-06垃圾收集Garbage Collection(下)【垃圾收集器】JVM - 再聊GC垃圾收集算法及垃圾收集器CMSConcurrent Mark Sweep 并发标记清除 。CMS 收集器是一种以获取最短回收停顿时间为目标的收集器。它非常符合在注重用户体验的应用上使用,它是原创 2020-06-30 00:14:18 · 15075 阅读 · 0 评论 -
JVM - 再聊GC垃圾收集算法及垃圾收集器
文章目录Pre分代收集理论常见的垃圾收集算法标记PreJVM-04垃圾收集Garbage Collection(上)【垃圾对象的判定】JVM-05垃圾收集Garbage Collection(中)【垃圾收集算法】JVM-06垃圾收集Garbage Collection(下)【垃圾收集器】分代收集理论当前虚拟机的垃圾收集都采用分代收集算法 , 意思就是根据对象存活周期的不同将 java堆分为新生代和老年代,这样就可以根据各个年代的特点选择合适的垃圾收集算法。举个例子,新生代中,大部分对象都是原创 2020-06-29 22:21:09 · 14251 阅读 · 0 评论 -
JVM-彻底搞懂 逃逸分析&标量替换
文章目录Pre对象分配流程总览逃逸分析所处的阶段示例说明逃逸分析的含义逃逸分析的对象分配的方式【标量替换】标量 VS 聚合量JVM 参数 -XX:+DoEscapeAnalysis栈上分配DemoPreJVM-剖析对象内存分配流程对象分配流程总览逃逸分析所处的阶段通过上图的对象分配流程,我们可以知道逃逸分析是发生在第一步判断对象是否可以在栈上分配的时候, 在栈上分配的目的是为了减少将对象分配到堆上的概率,节约堆内存,减少GC压力。逃逸分析是JVM为了优化对象分配而做的一种优化措施。原创 2020-06-27 11:22:17 · 17245 阅读 · 3 评论 -
JVM - 剖析Java对象头Object Header之指针压缩
文章目录Pre指针压缩【指针压缩】开启 VS 关闭PreJVM - 剖析Java对象头Object Header之对象大小mark word : 32位 占4字节 ,64位 占 8字节klass point : 开启压缩占4字节,未开启 占 8字节。指针压缩jdk1.6 update14开始,在64bit操作系统中,JVM支持指针压缩启用指针压缩-XX:+UseCompressedOops(默认开启),禁止指针压缩:-XX:-UseCompressedOopsoop(ordin原创 2020-06-25 23:58:20 · 14925 阅读 · 0 评论 -
JVM - 剖析Java对象头Object Header之对象大小
文章目录Pre总览PreJVM - 写了这么多年代码,你知不道new对象背后的逻辑? 中大体介绍了Java中 new 对象背后的主要流程,其中对象头的部分,我们仅仅是点到为止,这里我们深入剖一下Object Header的奥秘 。总览初始化默认值以后,JVM要对对象进行必要的设置,例如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的GC分代年龄等信息。这些信息存放在对象的对象头Object Header之中。 这部分数据的长度在32位和64位的虚拟机中分别为32个和64原创 2020-06-25 16:10:32 · 16087 阅读 · 0 评论 -
JVM - 写了这么多年代码,你还不知道new对象背后的逻辑?
文章目录对象创建流程1.类加载检查2.分配内存3.初始化4.设置对象头5.执行方法对象创建流程1.类加载检查2.分配内存3.初始化4.设置对象头5.执行方法原创 2020-06-24 21:44:33 · 14491 阅读 · 4 评论 -
JVM - 应用JVM核心参数推荐设置
文章目录PreJDK版本核心参数堆线程栈方法区(元空间)案例PreJVM-08垃圾收集Garbage Collection【GC常用参数】JDK版本= 1.8核心参数‐Xms2048M ‐Xmx2048M ‐Xmn1024M ‐Xss512K ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M 堆线程栈默认1M , 不足的话 StackOverflowError-Xss设置越小 ,说明一个线程栈里能分配的栈帧就越少,但是原创 2020-06-22 11:17:14 · 14754 阅读 · 0 评论 -
JVM - 结合代码示例彻底搞懂Java内存区域_对象在堆-栈-方法区(元空间)之间的关系
文章目录Pre示例demo总体关系代码示例论证反汇编PreJVM - 结合代码示例彻底搞懂Java内存区域_线程栈 | 本地方法栈 | 程序计数器中我们探讨了线程栈中的内部结构 ,大家有么有想过main方法呢? 我们继续来看下main方法示例demopackage com.gof.test;public class Artisan { public static int FIVE = 5 ; // 静态变量 public static User user = new U原创 2020-06-22 00:47:28 · 14632 阅读 · 0 评论 -
JVM - 结合代码示例彻底搞懂Java内存区域_线程栈 | 本地方法栈 | 程序计数器
文章目录Pre运行时数据区总览PreJVM-01Java内存区域与内存溢出异常(上)【运行时区域数据】JVM-02内存区域与内存溢出异常(中)【hotspot虚拟机对象】JVM-03内存区域与内存溢出异常(下)【OutOfMemoryError案例】运行时数据区总览字节码文件被装载子系统装载到JVM中,字节码执行引擎负责执行这些字节码文件。装载子系统和执行引擎都是C++的实现。我们重点关注下装载子系统: JVM-白话聊一聊JVM类加载和双亲委派机制源码解析...原创 2020-06-21 12:15:09 · 14506 阅读 · 0 评论 -
Java - 手撸线上故障 OOM + CPU居高不下
文章目录Pre常见故障OOMCPU居高不下高阶工具 ArthasPre当你的应用没有一套完善的监控告警系统,线上故障了 ,总是很被动,但是还得要定位问题 ,奈何手里无利器 ,没办法只能硬上了,虽然原始,好在有效~所以原生的命令你需要特别熟悉,故障的时间很宝贵,所以留给我们翻资料的时间并不多 ~如果你还不是很了解JVM提供的诊断命令, 戳这里–> JVM-10虚拟机性能监控与故障处理工具之【JDK的命令行】常见故障OOMCPU居高不下高阶工具 Arthashttps://原创 2020-06-20 15:32:44 · 14090 阅读 · 0 评论 -
Tomcat - 模拟Tomcat的webappClassLoader加载自己war包应用内不同版本类实现相互共存与隔离
文章目录PreTomcat要解决什么问题?Tomcat违反了双亲委派机制?模拟Tomcat的webappClassLoader加载自己war包应用内不同版本类实现相互共存与隔离Tomcat加载机制小结PreTomcat - 都说Tomcat违背了双亲委派机制,到底对不对?JVM-白话聊一聊JVM类加载和双亲委派机制源码解析JVM - 实现自定义的ClassLoader就是这么简单Tomcat要解决什么问题?作为一个Web容器,Tomcat要解决什么问题 , Tomcat 如果使用默认的双亲委原创 2020-06-13 10:07:06 · 14753 阅读 · 0 评论 -
JVM - 彻底理解打破双亲委派机制
文章目录Pre 双亲委派何为打破双亲委派演示Pre 双亲委派JVM-白话聊一聊JVM类加载和双亲委派机制源码解析JVM - 自定义类加载器何为打破双亲委派举个例子 有个类 Artisan我们希望通过自定义加载器 直接从某个路径下读取Artisan.class . 而不是说 通过自定义加载器 委托给 AppClassLoader ------> ExtClassLoader ----> BootClassLoader 这么走一遍,都没有的话,才让自定义加载器去加载 Artis原创 2020-06-12 00:11:41 · 21813 阅读 · 5 评论 -
JVM - 实现自定义的ClassLoader就是这么简单
文章目录Pre自定义类加载器演示Step1 : 复制一个Boss1 的类,编译后,取到Boss1.class 备用Step2 : 删除Boss1类Step3 : 编写自定义ClassLoaderStep 4: 自定义目录存放Boss1.classStep 5 : 运行结果注意事项PreJVM-白话聊一聊JVM类加载和双亲委派机制源码解析自定义类加载器我们了解了双亲委派机制后,那自定义类加载器相对就很容易了 , 只需要继承 java.lang.ClassLoader 类 ,重写findC原创 2020-06-11 23:49:15 · 14791 阅读 · 0 评论 -
JVM-白话聊一聊JVM类加载和双亲委派机制源码解析
文章目录Java 执行代码的大致流程类加载loadClass的步骤类加载器和双亲委派机制Java 执行代码的大致流程我们先回顾下Java 执行代码的大致流程假设要执行A类的main方法启动虚拟机 (C++负责创建)创建一个引导类加载器实例 (C++实现)C++ 调用Java代码,创建JVM启动器,实例sun.misc.Launcher 【这货由引导加载器负责加载创建其他类加载器】sun.misc.Launcher.getLauncher() 获取运行类自己的加载器ClassLo原创 2020-06-11 01:20:00 · 15457 阅读 · 3 评论 -
Java - 死锁 Dead Lock 定位分析
文章目录PrejstackThread dumpDead Lock 分析PreJVM-11虚拟机性能监控与故障处理工具之【JDK的可视化工具-JConsole】jstackjstack主要用来查看某个Java进程内的线程堆栈信息 ,建议多杀几次线程dump ,每次都有某个事件,基本没跑了~用法也很简单Thread dumpFound one Java-level deadlock:============================="T-ShortConn-4": wa原创 2020-05-20 15:01:43 · 14020 阅读 · 0 评论 -
JVM-12虚拟机性能监控与故障处理工具之【JDK的可视化工具-VisualVM】
思维导图概述插件安装生成、浏览堆转储快照分析程序性能思维导图概述Visual VM (All-in-One Java Troubleshooting Tool)是目前为止随JDK发布的功能最强大的运行监视和故障处理程序。 Visual VM除了提供运行监视、故障处理外,还提供了比如性能分析(Profiling),对应用程序的实际性能影响很小,使得它可以直接应...原创 2018-08-07 20:40:09 · 18618 阅读 · 0 评论 -
JVM-11虚拟机性能监控与故障处理工具之【JDK的可视化工具-JConsole】
思维导图概述JConsole: Java监视与管理平台启动jconsole内存监控示例线程监控示例VisualVM:多合一故障处理工具思维导图概述JVM-10虚拟机性能监控与故障处理工具之【命令行】我们接触了JDK提供的命令行工具,JDK还为我们提供了两个功能强大的可视化工具:JConsole和VisualVM。JConsole在JDK1.5...原创 2018-08-07 17:32:58 · 16699 阅读 · 0 评论 -
JVM-10虚拟机性能监控与故障处理工具之【JDK的命令行】
思维导图概述思维导图概述原创 2018-08-06 15:29:41 · 15582 阅读 · 0 评论 -
JVM-09自动内存管理机制【内存分配和回收策略】
思维导图对象优先在eden区域分配思维导图对象优先在eden区域分配原创 2018-08-01 16:42:16 · 15613 阅读 · 0 评论 -
JVM-08垃圾收集Garbage Collection【GC常用参数】
思维导图内存相关策略相关GC日志相关异常相关其他思维导图内存相关策略相关GC日志相关异常相关其他原创 2018-07-31 15:24:34 · 15247 阅读 · 2 评论 -
JVM-07垃圾收集Garbage Collection【GC日志分析】
概述概述每一种收集器的日志形式都是由他们自身的实现决定的,也就是说每个收集器的日志格式都可能不一样。 一般来说,常见的格式如下:[GC [<collector>: <starting occupancy1> -&原创 2018-07-30 20:35:15 · 15588 阅读 · 0 评论 -
JVM-06垃圾收集Garbage Collection(下)【垃圾收集器】
思维导图总览Serial收集器Serial Old收集器ParNew收集器Parallel Scavenge收集器Parallel Old收集器CMS收集器G1收集器与GC相关的常用参数思维导图总览Serial收集器Serial收集器是最古老的收集器。缺点: 当Serial收集器想进行垃圾回收的时候,必须暂停用户的所有进程,即...原创 2018-07-29 18:10:43 · 15523 阅读 · 2 评论 -
JVM-05垃圾收集Garbage Collection(中)【垃圾收集算法】
思维导图复制算法标记清除算法标记整理(压缩)算法分代收集算法思维导图JVM-04垃圾收集Garbage Collection(上)【垃圾对象的判定】探讨了如何判定堆内存中的对象是否已经死亡,这里我们来继续讨论下JVM中常用的垃圾搜集算法复制算法将现有的内存空间分为两快,每次只使用其中一块,在垃圾回收时将正在使用的内存中的存活对象复制到未被使用的内...原创 2018-07-29 16:41:02 · 15507 阅读 · 0 评论 -
JVM-04垃圾收集Garbage Collection(上)【垃圾对象的判定】
思维导图概述思维导图概述原创 2018-07-29 09:30:09 · 15772 阅读 · 0 评论 -
JVM-03内存区域与内存溢出异常(下)【OutOfMemoryError案例】
思维导图Java堆溢出前置操作测试类结果使用mat分析内存泄露Memory Leak内存溢出Memory Overflow虚拟机栈和本地方法栈溢出方法区和运行时常量池溢出本机直接内存溢出思维导图接下来,我们来通过示例来演示下出现异常的场景。Java堆溢出前置操作JVM参数官网 :http://www.oracle.com/...原创 2018-07-27 22:23:45 · 15492 阅读 · 0 评论 -
JVM-02内存区域与内存溢出异常(中)【hotspot虚拟机对象】
思维导图对象的创建对象的内存布局对象头( Header )实例数据(Instance Data)对齐填充(Padding)对象的访问定位使用句柄(类似间接指针)直接指针访问两种方式的比较思维导图在 JVM-01自动内存管理机制之Java内存区域与内存溢出异常(上)中我们介绍了 运行时数据区域,这里我们来继续探讨下hotspot虚拟机对象...原创 2018-07-27 19:20:58 · 15541 阅读 · 0 评论 -
JVM-01Java内存区域与内存溢出异常(上)【运行时区域数据】
对于Java开发人员来讲,在虚拟机自动内存管理机制的帮助下,不需要为每一个new操作去写配对的delete/free代码, 不容易出现内存泄露和内存溢出的问题。正是因为JVM管理内存控制的权利,一旦出现内存泄露和内存溢出的问题,如果不了解JVM是怎样使用内存的,排查错误将变得异常困难。原创 2016-10-16 22:12:58 · 12688 阅读 · 1 评论