work hard work smart

专注于Java后端开发。 不断总结,举一反三。
随笔 - 1158, 文章 - 0, 评论 - 153, 阅读 - 186万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

随笔分类 -  S.JVM

摘要:虚拟机栈:Stack Fame 栈桢 程序计数器(Program Counter): 本地方法栈:主要用于处理本地方法 堆(Heap): JVM管理的最大一块内存空间 方法区(Method Area): 存储元信息, 永久代(Permanent Generation),从JKD1.8开始,已经彻底废 阅读全文

posted @ 2019-06-30 21:14 work hard work smart 阅读(186) 评论(0) 推荐(0) 编辑

摘要:一、创建动态代理代码 1、创建接口 2、创建接口实现类 3、创建DynamicSubject类 4、创建测试类 输出结果: 查看源码,动态代理类在ProxyGenerator类的generateProxyClass生成。 可以发现saveGeneratedFiles为true时,可以将代理类保存到磁 阅读全文

posted @ 2019-06-30 15:15 work hard work smart 阅读(244) 评论(0) 推荐(0) 编辑

摘要:1、创建MyTest7 输出结果: animal testdog date 针对于方法调用动态分派的过程,虚拟机会在类的方法区建立一个虚方法表的数据结构(virtual method table, vtable),针对于invokeinterface指令来说,虚拟机会建立一个叫做接口方法表的数据结构 阅读全文

posted @ 2019-06-30 09:22 work hard work smart 阅读(245) 评论(0) 推荐(0) 编辑

摘要:1、方法重载 创建MyTest5类 输出结果如下: 2、方法的静态分派 Grandpa g1 = new Father(); 以上代码,g1的静态类型是Grandpa,而g1的实际类型(真正的指向的类型)是Father 我们可以得出这样一个结论:变量的静态类型是不会发生变化的,而实际类型则可以发生变 阅读全文

posted @ 2019-06-29 21:07 work hard work smart 阅读(908) 评论(1) 推荐(0) 编辑

摘要:1、栈桢(stack frame) 栈桢是一种用于帮助虚拟机执行方法调用与方法执行的数据结构。 栈桢本身是一种数据结构,封装了方法的局部变量表、动态链接信息,方法的返回地址以及操作数栈等信息 2、符号引用,直接引用有些符号引用是在类加载阶段或是第一次使用时就会转换为直接引用,这种转换叫做静态解析;另 阅读全文

posted @ 2019-06-29 20:31 work hard work smart 阅读(354) 评论(0) 推荐(0) 编辑

摘要:1、创建MyTest3类 然后生成字节码 D:\workspace\study\ jvm_demo\build\classes\java\main\com\example\jvm\bytecode>javap -verbose MyTest3.class 查看test方法 stack=3:表示操作数 阅读全文

posted @ 2019-06-29 17:03 work hard work smart 阅读(211) 评论(0) 推荐(0) 编辑

摘要:一、创建测试类 反编译MyTest2.class文件 二、将setX改为private 此时需要使用javap -verbose -p MyTest2.class才能显示私有方法 D:\workspace\study\ jvm_demo\build\classes\java\main\com\exa 阅读全文

posted @ 2019-06-27 15:25 work hard work smart 阅读(420) 评论(0) 推荐(0) 编辑

摘要:方法表 1、methods_count method_info,前三个字段和field_info一样 2、方法的属性结构 方法中的每个属性都是一个attribut_info结构 JVM定义了部分attribute,但是编译器自己也可以实现自己的attribute写入class文件里,供运行时使用。 阅读全文

posted @ 2019-06-24 23:36 work hard work smart 阅读(1109) 评论(0) 推荐(0) 编辑

摘要:编译的.class文件,可以用javap进行反编译 javap Test.class javap -c Test.class javap -verbose Test.class 1、创建MyTest1.java 使用D:\workspace\study\ jvm_demo\build\classes 阅读全文

posted @ 2019-06-23 20:23 work hard work smart 阅读(246) 评论(0) 推荐(0) 编辑

摘要:当一个类或一个资源文件存在多个jar中,就好存在jar hell问题 可以通过以下代码来诊断问题: 阅读全文

posted @ 2019-06-23 14:06 work hard work smart 阅读(672) 评论(0) 推荐(0) 编辑

摘要:当前类加载器(Current ClassLoader) 每个类都会使用自己的类加载器(即加载自身的类加载器)来去加载其他类(指所依赖的类) 如果ClassX引用了ClassY,那么ClassX的类加载器就会去加载ClassY(前提是ClassY尚未被加载) 线程上下文加载器(Context Clas 阅读全文

posted @ 2019-06-22 15:37 work hard work smart 阅读(964) 评论(0) 推荐(0) 编辑

摘要:1、创建Sample 打印结果: 2、现在要将扩展类加载器的路径指定为当前路径 显示结果: 会发现还是应用加载器加载。这里扩展类加载器会有一些区别,它需要打包成class打包成jar文件 然后将MyTest1.class打包到jar文件中 此时会发现有com文件夹下有MyTest1.class, t 阅读全文

posted @ 2019-06-15 21:56 work hard work smart 阅读(337) 评论(0) 推荐(0) 编辑

摘要:一、创建Sample 1、创建实例 2、创建测试类 3、MyTest16类和之前的一致 public class MyTest16 extends ClassLoader{ private String className; //目录 private String path; private fin 阅读全文

posted @ 2019-06-15 19:44 work hard work smart 阅读(720) 评论(0) 推荐(0) 编辑

摘要:1、创建类 查看打印结果 说明AESKeyGenerator类是由扩展加载器加载的。 修改扩展加载器的加载路径为当前路径 -Djava.ext.dirs=./ 再次打印,结果会抛出异常。 阅读全文

posted @ 2019-06-15 18:25 work hard work smart 阅读(255) 评论(0) 推荐(0) 编辑

摘要:1、类加载器加载路径 返回结果 将打印结果变成多行数据 2、修改类加载器启动类加载器 现在想把自己生成的类交给启动类加载器,那要怎么做呢? 主需要把生成的class文件放到根加载器的加载路径下 C:\Program Files\Java\jdk1.8.0_131\jre\classes 创建测试类 阅读全文

posted @ 2019-06-15 17:12 work hard work smart 阅读(605) 评论(0) 推荐(0) 编辑

摘要:一、自定义类加载器在复杂类情况下的运行分析 1、使用之前创建的类加载器 2、创建MyCat类 3、创建MySample类 4、创建测试类 打印结果 增加-XX:+TraceClassLoading后的打印结果 如果去掉Object object = clazz.newInstance(); 打印结果 阅读全文

posted @ 2019-06-15 13:21 work hard work smart 阅读(222) 评论(1) 推荐(0) 编辑

摘要:1、当某个类被加载,连接和初始化后,它的生命周期就开始了。当代表这个类的Class对象不再被引用,即不可触及时,Class对象就会结束生命周期,这个类在方法区内的数据也会被卸载,从而结束这个类的生命周期。 2、一个类何时结束生命周期,取决于代表它的Class对象何时结束生命周期。 3、由Java虚拟 阅读全文

posted @ 2019-06-13 22:58 work hard work smart 阅读(1176) 评论(1) 推荐(0) 编辑

摘要:一、创建自定义类加载器 打印结果 二、完善上一个实例创建的类加载器 命名空间: 每个类加载器都有自己的命名空间,命名空间由该加载器及所有父加载器所加载的类组成。 在同一个命名空间中,不会出现类的完整名字(包括类的包名)相同的两个类。 在不同的命名空间中,有可能会出现类的完整名字(包括类的包名)相同的 阅读全文

posted @ 2019-06-09 22:37 work hard work smart 阅读(304) 评论(0) 推荐(0) 编辑

摘要:创建如下Demo 运行结果 创建Demo2 打印结果: 创建Demo3 打印结果 4、Demo4 使用反射使类初始化 打印结果 说明反射Class.forName会使类初始化。而调用ClassLoader类的loadClass方法加载一个类,并不是对类的主动使用,不会导致类的初始化 阅读全文

posted @ 2019-06-09 20:22 work hard work smart 阅读(189) 评论(0) 推荐(0) 编辑

摘要:1、创建FinalTest类,里面有一个final常量x 然后在Main方法里打印fianl常量。打印结果 2、然后去掉final, 打印结果为: 3、将fianl常量改为随机生成 打印结果 阅读全文

posted @ 2019-06-09 20:19 work hard work smart 阅读(374) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示