JVM
文章平均质量分 85
JVM相关知识点讲解
邋遢的流浪剑客
成长中的基础架构攻城狮
展开
-
synthetic关键字和NBAC机制
1、synthetic关键字根据Java语言规范,所有存在于字节码文件中,但是不存在于源代码文件中的构造,都应该被synthetic关键字标注这里的构造,原文是Constructs,实际上指的是字段、方法和构造器([构造] => Constructs => Field、Method、Constructor)由Java编译器在编译阶段自动生成的构造都要被synthetic关键字标注1)、isSynthetic()java.lang.reflect中的Field、Method、Const原创 2021-12-05 16:07:52 · 1000 阅读 · 0 评论 -
findLoadedClass详解
问题AClassLoader的parent为BClassLoader,BClassLoader的parent为CClassLoader,当AClassLoader调用loadClass()加载类,并最终由CClassLoader加载的类,到底算谁加载的?后续AClassLoader再加载相同类时,是否能直接从AClassLoader的findLoadedClass0()中找到该类并返回,还是说再走一次双亲委派最终从CClassLoader的findLoadedClass0()中找到该类并返回?Syste原创 2021-08-28 21:40:46 · 1714 阅读 · 0 评论 -
ContextClassLoader详解
ContextClassLoader是通过Thread.currentThread().getContextClassLoader()返回该线程上下文的ClassLoader1、前置知识在讲解ContextClassLoader之前,需要先提两个知识点:1)双亲委派模型启动类加载器(Bootstrap ClassLoader):负责将放在<JAVA HOME>\lib目录中的,或者被-Xbootclasspath参数所指定的路径中的,并且是虚拟机识别的类库加载到虚拟机内存中。启动类加原创 2021-08-14 11:27:44 · 2461 阅读 · 0 评论 -
Java Attach机制实现原理
转自:https://www.jianshu.com/p/39d1899617731、什么是Attach机制在JVM运行时,我们经常需要获取目标JVM运行时的相关信息。最典型的一个场景就是通过jstack命令输出当前的线程dump对于这种场景,Java提供了attach机制。通过attach机制,可以直接attach到目标JVM进程,然后进行一些操作,比如获取内存dump、线程dump、类信息统计(比如已加载的类以及实例个数等)、动态加载agent、获取系统属性等Attach机制实际就是JDK提供转载 2021-04-24 15:26:50 · 3133 阅读 · 0 评论 -
Java Agent简介及使用Byte Buddy和AspectJ LTW监控方法执行耗时
1、什么是Java AgentJava Agent提供了一种在加载字节码时,对字节码进行修改的方法。一共有两种方式执行:一种是在main方法执行之前,通过premain来实现;另一种是在程序运行中,通过attach api来实现1)、InstrumentationInstrumentation是JDK1.5提供的API,用于拦截类加载事件,并对字节码进行修改,它的主要方法如下:public interface Instrumentation { //注册一个转换器,类加载事件会被注册的原创 2021-03-28 15:30:11 · 1474 阅读 · 0 评论 -
Tomcat类加载器机制详解
1、JVM的类加载器1)、类与类加载器对于任意一个类,都需要由加载它的类加载器和这个类本身一同确定其在Java虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间。比较两个类是否相等,只有在这两个类是由同一个类加载器加载的前提下才有意义,否则,即使这两个类来源于同一个Class文件,被同一个虚拟机加载,只要加载它们的类加载器不同,那这两个类就必定不相等这里的相等包括代表类的Class对象的equals()方法、isAssignableFrom()方法、isInstance()方法的返回结果,也原创 2021-04-04 08:14:15 · 646 阅读 · 0 评论 -
JVM实战:CMS和G1的物理内存归还机制
前言公司有一个系统使用的是CMS垃圾回收器,JVM初始堆内存不等于最大堆内存,但通过监控信息发现:在经过一次FullGC之后,服务器物理内存剩余空间并未提升,按照我之前的理解FullGC之后JVM进程会释放的内存一部分还给物理内存,下面通过几个实验来对比验证一下CMS和G1的物理内存归还机制测试代码public class MemoryRecycleTest { static volatile List<OOMobject> list = new ArrayList<>原创 2020-12-05 09:56:36 · 4561 阅读 · 6 评论 -
JVM与多线程知识点补充
一、垃圾收集器相关1、HotSpot的算法细节实现其实下面讲到的技术本质上是为了解决垃圾回收过程中的具体问题而采用的解决方案,所以我会先说明遇到的问题再讲解HotSpot给出相对应的解决方案1)、OopMap在判断对象是否存活的时候,采用的是可达性分析算法,也就是从GC Roots集合找引用链这样的一个过程。虽然固定可以作为GC Roots的节点主要在全局性的引用(例如常量或类静态属性)与执行上下文(例如栈帧中的本地变量表)中,但如果要逐个检查以这里为起源的引用要消耗不少的时间。而且为了保证分析结原创 2020-08-23 19:02:34 · 698 阅读 · 1 评论 -
Java分析线上OOM问题的工具
一、相关工具介绍1、jpsjps可以列出正在运行的虚拟机进程,并显示虚拟机执行主类名以及这些进程的本地虚拟机唯一ID(LVMID),LVMID与操作系统的进程ID(PID)是一致的/ # jps1 ExpenseApplication6370 Jps选项作用-v输出虚拟机进程启动时的JVM参数后面介绍的命令都监控的是LVMID为1的这个JVM进程2、jstatjstat是用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类加载、原创 2020-08-01 13:23:28 · 1534 阅读 · 0 评论 -
垃圾收集器G1详解
G1(Garbadge First Collector)作为一款JVM最新的垃圾收集器,可以解决CMS中Concurrent Mode Failed问题,尽量缩短处理超大堆的停顿,在G1进行垃圾回收的时候完成内存压缩,降低内存碎片的生成。G1在堆内存比较大的时候表现出比较高吞吐量和短暂的停顿时间,而且已成为Java 9的默认收集器G1的GC原理RegionG1的内存结构和传统的内存空间划分有...转载 2020-01-12 10:37:27 · 848 阅读 · 0 评论 -
JVM复习(二):类编译加载执行过程、即时编译
六、类编译加载执行过程Java从编译到运行的整个过程如下图:1、类编译.java文件编译成.class文件的过程中,包括词法分析、填充符号表、注解处理、语义分析以及生成class文件使用javap反编译一个class文件结构中主要包含了如下信息:编译后的字节码文件主要包括常量池和方法表集合这两部分常量池主要记录的是类文件中出现的字面量以及符号引用。字面常量包括字符串常量,声明为fi...原创 2020-01-04 18:13:28 · 883 阅读 · 2 评论 -
JVM复习(一):JVM内存模型、HotSpot虚拟机对象、垃圾回收算法、垃圾收集器、内存分配与回收策略
一、JVM内存模型JVM运行时数据区域分为线程独占区和线程共享区,线程独占区包括虚拟机栈、本地方法栈、程序计数器,线程共享区包括堆和方法区1、堆堆是JVM内存中最大的一块内存空间,该内存被所有线程共享,几乎所有对象和数组都被分配到了堆内存中。堆被划分为新生代和老年代,新生代又被进一步划分为Eden和Survivor区,最后Survivor由From Survivor和To Survivor...原创 2020-01-04 10:12:32 · 873 阅读 · 0 评论 -
JVM:晚期(运行期)优化
晚期(运行期)优化在部分的商用虚拟机中,Java程序最初是通过解释器进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为热点代码。为了提高热点代码的执行效率,在运行时,虚拟机会将这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器本章提到的编译器、即时编译器都是指HotSpot虚拟机内的即时编译器,虚拟机也是特质HotSp...原创 2019-02-02 10:11:08 · 678 阅读 · 0 评论 -
JVM:早期(编译期)优化
早期(编译期)优化JVM的编译器可以分为三个编译器:前端编译器:把*.java转变为*.class的过程。如Sun的Javac、Eclipse JDT中的增量式编译器(ECJ)JIT编译器:把字节码转变为机器码的过程,如HotSpot VM的C1、C2编译器AOT编译器:静态提前编译器,直接将*.java文件编译本地机器代码的过程本章的后续文字里,“编译期”和“编译器”都仅限于第一类...原创 2019-02-01 15:58:12 · 633 阅读 · 4 评论 -
JVM:虚拟机字节码执行引擎
虚拟机字节码执行引擎物理机的执行引擎是直接建立在处理器、硬件、指令集和操作系统层面上的,而虚拟机的执行引擎则是由自己实现的,因此可以自行制定指令集与执行引擎的结构体系,并且能够执行那些不被硬件直接支持的指令集格式执行引擎在执行Java代码的时候可能会有解释执行(通过解释器执行)和编译执行(通过即时编译器产生本地代码执行)两种选择从外观上看起来,所有的Java虚拟机的执行引擎都是一致的:输入的...原创 2019-02-01 09:32:02 · 611 阅读 · 0 评论 -
JVM:虚拟机类加载机制
虚拟机类加载机制1、类加载的时机类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载7个阶段。其中验证、准备、解析3个部分统称为连接加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,类的加载过程必须按照这种顺序按部就班地开始,而解析阶段则不一定:它在某些情况下可以在初始化阶段之后在开始,这是为了支持Java语言的运行时绑定(...原创 2019-01-27 23:54:32 · 506 阅读 · 0 评论 -
JVM:类文件结构2
类文件结构1:https://blog.csdn.net/qq_40378034/article/details/86664632类文件结构26)、方法表集合方法表的结构如同字段表一样,依次包括了访问标志(access_flags)、名称索引(name_index)、描述符索引(descriptor_index)、属性表集合(attributes)几项类型名称数量u2...原创 2019-01-27 11:39:00 · 542 阅读 · 0 评论 -
JVM:类文件结构1
类文件结构1、无关性的基石无关性包括:平台无关性和语言无关性各种不同平台的虚拟机与所有平台都统一使用的程序存储格式——字节码是构成平台无关性的基石实现语言无关性的基础仍然是虚拟机和字节码存储格式。Java虚拟机不和包括Java在内的任何语言绑定,它只与Class文件这种特定的二进制文件格式所关联,Class文件包含了Java虚拟机指令集和符号表以及若干其他辅助信息。基于安全方面的考虑,Ja...原创 2019-01-27 11:34:58 · 563 阅读 · 0 评论 -
JVM:垃圾收集器与内存分配策略
垃圾收集器与内存分配策略1、对象已死吗1)、引用计数算法引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的主流的Java虚拟机里面没有选用引用计数算法来管理内存,其中最主要的原因是它很难解决对象之间相互循环引用的问题。两个对象相互引用着对方,导致它们的引用计数都不为0,于是引用计数算法...原创 2019-01-25 20:57:43 · 989 阅读 · 0 评论 -
JVM:Java内存区域
上周开始看周志明老师的《深入理解Java虚拟机》,目前看完第三章了,今天复习了一下前面看的内容,正好做一下总结Java内存区域1、运行时数据区域运行时数据区域分为线程独占区和线程共享区,线程独占区包括虚拟机栈、本地方法栈、程序计数器,线程共享区包括堆和方法区1)、程序计数器程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器如果线程正在执行的是一个Java方...原创 2019-01-25 20:36:59 · 539 阅读 · 0 评论