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

06 2019 档案

摘要:虚拟机栈: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) 编辑

摘要:现代JVM在执行Java代码的时候,通常都会将解释执行与编译执行两者结合起来 所谓解释执行,就是通过解释器来读取字节码,遇到相应的指令就去执行该指令。 所谓编译执行,就是通过即时编译器(Just In Time,JIT) 将字节码转为本地机器码来执行;现代JVM会根据代码热点来生成相应的本地机器码。 阅读全文

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

摘要: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) 编辑

摘要:关闭chrome,使用cmd命令进入chrome安装目录cd C:\Program Files (x86)\Google\Chrome\Application 然后使用命令打开chromechrome.exe --user-data-dir="C:/Chrome dev session" --dis 阅读全文

posted @ 2019-06-25 17:06 work hard work smart 阅读(1278) 评论(0) 推荐(1) 编辑

摘要:方法表 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) 编辑

摘要:在运行期,一个Java类是由该类的完全限定名(binary name,二进制名)和用于加载该类的定义类加载器(defining loading)所共同决定的。如果同样名字(即相同的完全限定名)的类由两个不同的加载器所加载,那么这些类就是不同的,即便.class文件的字节码完全一样,并且从相同的位置加 阅读全文

posted @ 2019-06-15 22:14 work hard work smart 阅读(327) 评论(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) 编辑

摘要:1、类加载器的层次结构 在双亲委托机制中,各个加载器按照父子关系形成了树形结构(逻辑意义),除了根加载器之外,其余的类加载器都有且只有一个父加载器。 打印结果 null说明classLoader是启动类加载器 2、类加载器的双亲委托机制 3、返回String类的ClassLoader 返回结果 nu 阅读全文

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

摘要:BeanFactory和FactoryBean的联系和区别 BeanFactory是整个Spring容器的根容器,里面描述了在所有的子类或子接口当中对容器的处理原则和职责,包括生命周期的一些约定。 FactoryBean本身存活在BeanFactory当中,也是一种工厂。这个工厂的作用是用于获取Fa 阅读全文

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

摘要:一、下载Spring 源码 进入 https://github.com/spring-projects/spring-framework/tags 选择下载spring freamework的版本 https://repo.spring.io/release/org/springframework/ 阅读全文

posted @ 2019-06-08 21:46 work hard work smart 阅读(177) 评论(0) 推荐(0) 编辑

摘要:当Java虚拟机初始化一个类时,要求它的所有父类都已经初始化,但是这条规则不适于接口 1) 当初始化一个类时,并不会先初始化它所实现的类的接口。 2) 在初始化一个接口时,并不会先初始化它的父接口 因此,一个父接口并不会因为它的子接口或者实现类的初始化而初始化。只有当程序首次使用特定接口的镜头变量时 阅读全文

posted @ 2019-06-08 16:45 work hard work smart 阅读(547) 评论(0) 推荐(0) 编辑

摘要:1、类加载流程图 从磁盘加载到销毁的完整过程。 2、类加载流程图2 1、加载: 就是把二进制形式的java类型读入java虚拟机中 2、连接: 验证、准备、解析。 连接就是将已经读入到内存的类的二进制数据和合并到虚拟机的运行时环境中 验证: 类文件的结构检查 语义检查 字节码验证 二进制兼容性验证 阅读全文

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

摘要:1、创建一个Mytest6类和Singleton类 输出结果 2、将counter2成员变量的位置移动到构造函数后面 输出结果如下: 首先Singleton singleton = Singleton.getInstance(); 是调用Singleton类的getInstance(),属于主动调用 阅读全文

posted @ 2019-06-08 12:59 work hard work smart 阅读(232) 评论(0) 推荐(0) 编辑

摘要:1、创建两个接口,MyParent5接口,MyChild5 接口继承自MyParent5接口 接口成员变量默认为:public static final 打印结果 1、删除MyParent5.class 程序还是能正常运行。 2、接着讲MyChild5.class 程序还是能正常运行 总结: 当一个 阅读全文

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

摘要:1、创建数组 创建一个MyParent4[] 数组 打印结构 说明此处并不符合主动使用的场景,所有不会初始化MyParent4。 打印myParent4s.getClass()的结果为数组类型。[Lcom.example.jvm.classloader.MyParent4 这个类型是JVM在运行期创 阅读全文

posted @ 2019-06-08 10:47 work hard work smart 阅读(629) 评论(1) 推荐(0) 编辑

摘要:1、定义一个常量 打印结果: 此时MyParent2类不会进行实例化,因为str是一个常量。常量在编译阶段,会存如调用这个常量的方法所在类的常量池中。本质上,调用类并没有直接引用到定义常量的类,因此并不会触发定义常量的类初始化。 注意: 这里值的是将常量str存放到MyTest2类的常量池中,之后M 阅读全文

posted @ 2019-06-07 22:27 work hard work smart 阅读(254) 评论(0) 推荐(0) 编辑

摘要:主动使用和被动使用Demo 1、创建工程一个Gradle工程 下一步 下一步 点击完成 2、创建类 输出结果: 会发现MyChild1的类静态块没有执行。 总结:对于静态字段来说,只有直接定义了该字段的类才会被初始化。 修改后的类: 执行结果 因为使用到了MyChild的类,它会被初始化。当一个类在 阅读全文

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

摘要:1、下载Gradle 我这里下载的是Gradle4.0 将下载的文件放在D:\gradle\gradle-4.0路径下 2、为Gradle配置环境变量 修改Path变量: %GRADLE_HOME%\bin 阅读全文

posted @ 2019-06-07 19:55 work hard work smart 阅读(171) 评论(0) 推荐(0) 编辑

摘要:编译语言和解释语言 1、编译语言: 需要通过编译器(compiler)将源代码编译成机器码,之后才能执行的语言。 一般需经过编译,链接两个步骤: 编译:把原代码编译成机器码 链接:把各个模块和依赖库串起来生成可执行文件。 优点: 编译器一般会有预编译的过程对代码进行优化。因为编译只做一次,运行时不需 阅读全文

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

摘要:HashSet底层使用HashMap实现。当使用add方法将对象添加到Set当中时,实际上是将该对象作为底层所维护的Map对象的key,而value则都是同一个Object对象(该对象我们用不上)。 1、 HashSet的构造函数 2、HashSet的add方法, 其中PRESENT是一个假的对象 阅读全文

posted @ 2019-06-01 21:51 work hard work smart 阅读(138) 评论(0) 推荐(0) 编辑

摘要:场景: 随机生成50个10到50的数字。然后顺序输出每个数字出现的次数 实现原理: 使用TreeMap,默认带了顺序排序的功能 阅读全文

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

摘要:一、创建TreeSet实例 输出 输出是有序的。 二、TreeSet实例,按字符倒叙排列 实现了Comparator接口 打印: [F, D, C, B, A] 三、按数字倒叙排列 打印结果 [100, 70, 60, 50] 四、使用Collections降序 [35, 25, 15, 5, 1] 阅读全文

posted @ 2019-06-01 19:22 work hard work smart 阅读(205) 评论(0) 推荐(0) 编辑

摘要:1、关于Object类的equals方法的特点 a) 自反性: x.equals(x) 应该返回true b) 对称性: x.equals(y)为true,那么y.equals(x) 也为true c) 传递性: x.equals(y)为true,并且y.equals(z) 为true, 那么x.e 阅读全文

posted @ 2019-06-01 16:10 work hard work smart 阅读(148) 评论(0) 推荐(0) 编辑

摘要:一、集合框架中的接口 所谓框架就是一个类库的集合。集合框架就是一个用来表示和操作集合的统一的架构,包含了实现集合的接口与类。 二、集合框架的实现类 Set HashSet : Java HashSet介绍 LinkedHashSet: 用的较少 SortedSet TreeSet: Java Tre 阅读全文

posted @ 2019-06-01 16:04 work hard work smart 阅读(120) 评论(0) 推荐(0) 编辑

摘要:1、ArrayList底层采用数组实现,当使用不带参数的构造方法生成ArrayList对象时,实际上回在底层生成一个长度为10的Object类型数组。 2、如果增加的元素个数超过10个,那么ArrayList底层会将数组长度扩大到原数组的1.5倍。 3、对ArrayList元素的删除操作,需要将被删 阅读全文

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

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