![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM
神蜗牛
刚入行的萌新渣硕,想与各位大佬一起学习。
展开
-
JVM学习笔记58——动态代理实现机制深层次分析与动态代理运作机制
实现一个动态代理:public interface Subject { void request();}public class RealSubject implements Subject{ @Override public void request() { System.out.println("From real subject"); }}public class DynamicSubject implements Invocat原创 2021-05-10 19:56:34 · 60 阅读 · 0 评论 -
JVM学习笔记51——栈帧与操作数栈剖析及符号引用与直接引用的转换
栈帧(stack frame)是一种帮助虚拟机执行方法调用与方法执行的数据结构,封装了方法的局部变量表、动态链接信息、方法的返回地址以及操作数栈等信息。slot是存储局部变量表的最小单位 可复用 复用情况与虚拟机的具体实现有关有些符号引用是在类加载阶段或是第一次使用时就会转换为直接引用,这种转换叫做静态解析;另外一些符号引用则是在每次运行期转换为直接引用,这种转换叫做动态链接,这体现为Java的多态性。直接引用的五种情况:invokeinterface:调用接口中的方法,实际上是运行期决定的原创 2021-05-10 19:07:47 · 251 阅读 · 0 评论 -
JVM学习笔记47——通过字节码分析this关键字以及异常表的重要作用
public class MyTest3 { public void test(){ try{ InputStream inputStream = new FileInputStream("test.txt"); ServerSocket serverSocket = new ServerSocket(9999); serverSocket.accept(); }catch (FileNot.原创 2021-05-10 15:10:42 · 99 阅读 · 0 评论 -
JVM学习笔记46——synchronized关键字所产生的字节码详细分析
javap -verbose -p 显示私有成员,方法的命令public class MyTest2 { String str = "Welcome"; private int x = 5; public static Integer in = 10; public void setX(int x) { this.x = x; } public static void main(String[] args) {原创 2021-05-10 14:28:18 · 115 阅读 · 0 评论 -
JVM学习笔记38-42——Java字节码内容剖析
1、使用javap -verbose命令分析一个字节码文件时,将会分析该字节码文件的魔数、版本号、常量池、类信息、类的构造方法、类中的方法信息、类变量与成员变量等信息。2、魔数:所有的.class字节码文件的前四个字节都是魔数,魔数值为固定值:0xCAFEBABE3、魔数之后的4个字节为版本信息,前两个字节表示minor version (次版本号),后两个字节表示major version(主版本号)。这里版本号为00 00 00 34,换算成十进制,表示次版本号为0,主版本号为52,所以该版本号原创 2021-05-10 14:28:05 · 123 阅读 · 0 评论 -
JVM学习笔记37——Java字节码文件结构剖析
public class MyTest1 { private int a = 1; public int getA() { return a; } public void setA(int a) { this.a = a; }}查看MyTest1的字节码文件$ cd target/classes$ javap -c com.yshuoo.jvm.bytecode.MyTest1Compiled from "My.原创 2021-05-10 14:27:52 · 64 阅读 · 0 评论 -
JVM学习笔记32——JVM类加载器阶段性总结与学习方式升级
加载、连接、初始化程序的生命周期连接的过程初始化的作用主动使用的七种方式加载.class文件的方式初始化与类实例化要区分开类的初始化步骤接口与普通类初始化的区别类加载的父亲委托机制...原创 2021-05-09 16:57:24 · 69 阅读 · 0 评论 -
JVM学习笔记31——通过JDBC驱动加载深刻理解线程上下文加载器机制
public static void main(String[] args) throws Exception{ Class.forName("com.mysql.jdbc.Driver"); Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mytestdb", "username", "password"); }通过源码看JDBC到底是如何被加载.原创 2021-05-09 16:32:25 · 80 阅读 · 0 评论 -
JVM学习笔记30——线程上下文类加载器实战分析与难点剖析
将当前线程的类加载器设置为扩展类加载器public static void main(String[] args) { Thread.currentThread().setContextClassLoader(MyTest26.class.getClassLoader().getParent()); ServiceLoader<Driver> loader = ServiceLoader.load(Driver.class); Iter.原创 2021-05-09 15:43:39 · 83 阅读 · 0 评论 -
JVM学习笔记26——自定义系统类加载器源码分析与forName方法底层剖析
public static Class<?> forName(@NonNls String name, boolean initialize, ClassLoader loader) throws ClassNotFoundExceptionExternal annotations available:@org.jetbra...原创 2021-05-09 14:43:04 · 91 阅读 · 0 评论 -
JVM学习笔记25——Launcher类源码分析
public static ClassLoader getSystemClassLoader()Returns the system class loader for delegation. This is the default delegation parent for new ClassLoader instances, and is typically the class loader used to start the application.This method is first in原创 2021-05-09 14:42:52 · 154 阅读 · 0 评论 -
JVM学习笔记22——类加载器命名空间深度解析与实例分析
public class MyTest20 { public static void main(String[] args) throws Exception{ MyTest16 loader1 = new MyTest16("loader1"); MyTest16 loader2 = new MyTest16("loader2"); Class<?> clazz1 = loader1.loadClass("com.yshuoo.jvm.原创 2021-05-08 16:39:04 · 82 阅读 · 0 评论 -
JVM学习笔记21——类加载器实战剖析与疑难点解析
查看各类加载器的加载路径:// 查看加载器位置System.out.println(System.getProperty("sun.boot.class.path"));System.out.println(System.getProperty("java.ext.dirs"));System.out.println(System.getProperty("java.class.path"));public class MyTest18_1 { public static voi原创 2021-05-08 16:04:20 · 73 阅读 · 0 评论 -
JVM学习笔记20——类加载器命名空间实战剖析与透彻理解
在上一节的基础上创建MyTest17_1public class MyTest17_1 { public static void main(String[] args) throws Exception{ // 将系统类加载器当做loader1的父加载器 MyTest16 loader1 = new MyTest16("loader1"); loader1.setPath("D:\\workspace\\"); Class&原创 2021-05-08 15:25:23 · 67 阅读 · 0 评论 -
JVM学习笔记19——自定义类加载器在复杂类加载情况的运行分析
public class MyCat { public MyCat(){ System.out.println("MyCat is loaded by: " + this.getClass().getClassLoader()); }}public class MySample { public MySample(){ System.out.println("MySample is loaded by: " + this.getCl.原创 2021-05-08 14:44:39 · 83 阅读 · 0 评论 -
JVM学习笔记18——类的命名空间与卸载详解及jvisualvm的使用
MyTest16 loader2 = new MyTest16(loader1,"loader2");将loader1作为loader2的父类加载器,输出如下:loader2会委托loader1去加载MyTest1,在第一次已经被加载过,所以第二次不再重复加载保持MyTest1.class删除,增加loader3public static void main(String[] args) throws Exception{ MyTest16 loader1 = new.原创 2021-05-08 12:15:38 · 93 阅读 · 1 评论 -
JVM学习笔记17——类加载器双亲委托机制实力剖析
@Override protected Class<?> findClass(String className) throws ClassNotFoundException { System.out.println("findClass invoked: " + className); System.out.println("class loader name: " + this.classLoaderName); byte[] byt.原创 2021-05-08 11:37:57 · 85 阅读 · 0 评论 -
JVM学习笔记16——类加载器重要方法详解
defineClass详解protected final Class<?> defineClass(String name, byte[] b, int off, int len) throws ClassForma...原创 2021-05-08 10:49:48 · 83 阅读 · 0 评论 -
JVM学习笔记15——自定义类加载器深入详解
The ClassLoader class uses a delegation model to search for classes and resources. Each instance of ClassLoader has an associated parent class loader. When requested to find a class or resource, a ClassLoader instance will delegate the search for the class原创 2021-05-08 10:21:42 · 125 阅读 · 0 评论 -
JVM学习笔记14——ClassLoader源码分析与实例剖析
Class objects for array classes are not created by class loaders, but are created automatically as required by the Java runtime. The class loader for an array class, as returned by Class.getClassLoader() is the same as the class loader for its element type原创 2021-05-08 09:49:34 · 62 阅读 · 0 评论 -
JVM学习笔记13——不同的类加载器作用于加载动作分析
public class MyTest13 { public static void main(String[] args){ ClassLoader classLoader = ClassLoader.getSystemClassLoader(); System.out.println(classLoader); while (null != classLoader){ classLoader = classLoader..原创 2021-05-07 22:03:19 · 95 阅读 · 0 评论 -
JVM学习笔记12——类加载器与类初始化深度剖析
public class MyTest8 { public static void main(String[] args){ System.out.println(FinalTest.x); }}class FinalTest { public static final int x = 3; static { System.out.println("FinalTest static block"); }}不会输出静.原创 2021-05-07 20:45:15 · 86 阅读 · 0 评论 -
JVM学习笔记11——类加载器双亲委托机制详解
类加载器的父亲委托机制在父亲委托机制中,各个加载器按照父子关系形成了树形结构,除了根类加载器之外,其余的类加载器都有且只有一个父加载器原创 2021-05-07 20:01:02 · 87 阅读 · 0 评论 -
JVM学习笔记10——初始化对于类与接口的异同点深入解析
public class MyTest5 { public static void main(String[] args){ System.out.println(MyChild5.b); System.out.println(MyChild6.thread); }}interface MyParent5 { public static final int a = 5; // public static final int a .原创 2021-05-07 11:28:23 · 71 阅读 · 0 评论 -
JVM学习笔记9——类加载器深入解析及重要特性剖析
类的加载的 最终产品是位于内存中的Class对象有两种类型的类加载器Java虚拟机自带的加载器:根类加载器(Bootstrap) 扩展类加载器(Extension) 系统(应用)类加载器(System)用户自定义的类加载器:Java.lang.ClassLoader的子类 用户可以定制类的加载方式类记载器并不需要等到某个类被“首次主动使用”时再加载它。JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到.class文件缺失或存在错误时才报告..原创 2021-05-07 10:31:58 · 73 阅读 · 0 评论 -
JVM学习笔记8——接口初始化规则与类加载器准备阶段和初始化阶段的重要意义分析
public class MyTest5 { public static void main(String[] args){ System.out.println(MyChild5.b); }}interface MyParent5 { public static final int a = 5;}interface MyChild5 extends MyParent5 { public static final int b = 6;}.原创 2021-04-15 16:31:53 · 103 阅读 · 0 评论 -
JVM学习笔记7——编译期常量与运行常量的区别及数组创建本质分析
public class MyTest3 { public static void main(String[] args) { System.out.println(MyParent3.str); }}class MyParent3{ public static final String str = UUID.randomUUID().toString(); static { System.out.println("MyPare.原创 2021-04-15 15:41:42 · 79 阅读 · 0 评论 -
JVM学习笔记6——常量的本质含义与反编译及助记符详解
public class MyTest1 { public static void main(String[] args){ System.out.println(MyChild1.str); }}class MyParent1{ public static String str = "hello world"; static{ System.out.println("MyParent1 static block"); .原创 2021-04-13 17:04:40 · 73 阅读 · 0 评论 -
JVM学习笔记5——类的加载连接与初始化过程详解
Java程序对类的使用方式可分为两种:主动使用 被动使用所有的Java虚拟机实现必须在每个类或接口被Java程序“首次主动使用”时才初始化他们。主动使用(七种)创建类的实例 new Object() 访问某个类或接口的静态变量,或者对该静态变量赋值 调用类的静态方法 反射(如Class.forName("com.test.Test")) 初始化一个类的子类// 在初始化Child的时候也会初始化Parentsprivate class Child extends Parents原创 2021-04-13 16:18:45 · 88 阅读 · 0 评论 -
JVM学习笔记4——类加载器深入解析与阶段分解
类加载:加载,连接,初始化,使用,卸载类型的加载(字节码),连接与初始化(对一些静态变量进行赋值)过程都是在程序运行期间完成的,顺序是和所使用的虚拟机有关系。类加载器深入剖析:Java虚拟机与程序的生命周期,在如下几种情况下,Java虚拟机将结束生命周期执行了System.exit()方法 程序正常执行结束 程序在执行过程中遇到了异常或者错误而终止 由于操作系统出现错误而导致Java虚拟机进程终止类的加载、连接与初始化加载:查找并加载类的二进制数据(把类的class文件加载到内存原创 2021-04-09 21:25:21 · 86 阅读 · 0 评论 -
java.lang.ClassNotFoundException: org/apache/commons/pool2/impl/DefaultEvictionPolicy
在使用redis的时候会报这个错,原因是comons-pool2版本低导致的,我使用的是2.3,实际上应该使用2.4区别在于2.4在用class.forName加载类时如果用当前线程上下文加载器加载不到,则使用加载BaseGenericObjectPool的类加载器加载DefaultEvictionPolicy但是只有使用ForkJoinPool的时候会发生加载不到Defau...原创 2020-03-05 16:31:18 · 353 阅读 · 0 评论 -
JVM学习笔记29——ServiceLoader在SPI中的重要作用分析
以JDBC为例,介绍SPI如何打破双亲委托模型首先看看驱动的类加载器public class MyTest26 { public static void main(String[] args) { ServiceLoader<Driver> loader = ServiceLoader.load(Driver.class); Itera...原创 2021-05-09 15:15:44 · 166 阅读 · 0 评论 -
JVM学习笔记28——线程上下文加载器本质剖析与实现
public class MyTest25 implements Runnable{ private Thread thread; public MyTest25 (){ thread = new Thread(this); thread.start(); } @Override public void run() ...原创 2021-05-09 14:43:28 · 164 阅读 · 0 评论 -
JVM学习笔记27——线程上下文加载器分析与实现
编写MyTest24public class MyTest24 { public static void main(String[] args) { System.out.println(Thread.currentThread().getContextClassLoader()); System.out.println(Thread.class.g...原创 2021-05-09 14:43:15 · 186 阅读 · 0 评论 -
JVM学习笔记24——平台特定的启动类加载器深入分析与自定义系统加载器详解
在运行期,一个Java类是由该类的完全限定名(binary name,二进制名)和用于加载该类的定义类加载器(defining loader)所共同决定的。如果同样名字(即相同的完全限定名)的类是由两个不同的加载器所加载,那么这些类就是不同的,即便.class文件的字节码完全一样,并且从相同的位置加载亦是如此。编写MyTest23public class MyTest23 { ...原创 2021-05-09 14:42:38 · 219 阅读 · 0 评论 -
JVM学习笔记23——类加载器命名空间总结与扩展类加载器要点分析
类加载器的双亲委托模型的好处可以确保Java核心库的类型安全:所有的Java应用都至少会引用java.lang.object类,也就是说在运行期,java.lang.object这个类会被加载到java虚拟机中;如果这个加载过程是由Java应用自己的类加载器所完成的,那么很可能就会在jvm中存在多个版本的java.lang.object类,而且这些类之间是不兼容的,相互不可见的(正是命名空间在...原创 2021-05-09 14:42:11 · 160 阅读 · 0 评论