黑马程序员JVM系列学习
B站黑马程序员的JVM课程,https://www.bilibili.com/video/BV1r94y1b7eS?p=1&vd_source=50780a5baa4bc062d4179200db261b76
cool6736473
世界上只有一种英雄主义,那就是认清生活的真相后依旧热爱生活。
展开
-
黑马程序员JVM系列学习——自动垃圾回收(三):堆回收——软引用
GC Root对象跟普通对象有引用关系,只要这层关系存在,普通对象就不会被回收。除了强引用之外,Java中还有其他几种引用方式。原创 2024-03-02 11:45:46 · 374 阅读 · 0 评论 -
黑马程序员JVM系列学习——面试:运行时数据区域
Java虚拟机栈、本地方法栈:虚拟机栈采用栈的数据结构管理方法中国的基本数据(局部变量、操作数等),每一个的调用使用一个栈帧保存。会溢出(递归调用不正确时)。程序计数器:每个线程会通过程序计数器记录当前要执行的字节码指令的地址,程序计数器可以控制程序指令的进行,实现分支、跳转、异常等逻辑。方法区:存放类的元信息,以及保存了常量池。若存放了大量类的信息会溢出。堆:存放创建出来的的对象,最容易产生内存溢出的位置。原创 2024-03-01 16:06:48 · 389 阅读 · 0 评论 -
黑马程序员JVM系列学习——自动垃圾回收(四):堆回收——弱、虚、终结器引用
在对象需要被回收时,终结器引用会关联对象并放置在Finalizer类中的引用队列中,在稍后由一条由FinalizerThread线程从队列中获取对象,然后执行对象的finalize方法,在对象第二次被回收时,该对象才真正的被回收。这个过程中可以在finalize中再将自身对象使用强引用关联上,但不建议。直接内存中为了及时知道直接内存对象不再使用从而进行回收,使用虚引用来实现。虚引用唯一的用途是当对象被垃圾回收器回收时可以接收到对应的通知。若引用本身也可以使用引用队列进行回收。与软引用类似,唯一区别为。原创 2024-03-02 12:10:13 · 377 阅读 · 0 评论 -
黑马程序员JVM系列学习——自动垃圾回收(二):堆回收——引用计数法和可达性分析法
Java中一个对象是否能被回收时根据对象来决定的,如果被引用了说明对象还在使用中不允许被回收。如上面代码,new创建对象后,在堆上创建对象,在栈上会保存有该对象的引用。demo=null后,无引用,此时堆上对象可以被回收。原创 2024-03-01 23:05:51 · 418 阅读 · 0 评论 -
黑马程序员JVM系列学习——自动垃圾回收(一):方法区的回收
C/C++没有自动垃圾回收机制,一个对象如果不再使用需要手动释放,否则会出现内存泄漏。内存泄漏:不再使用的对象在系统中未回收,可能导致内存溢出。通过垃圾回收器来对不再使用的对象完成自动的回收,主要负责对堆上内存进行回收。线程不共享的三部分,程序计数器,Java虚拟机栈以及本地方法栈,都是伴随着线程的创建而创建,线程的销毁而销毁,方法的栈帧会在执行完方法后自动弹出并释放掉对应的内存。不需要垃圾回收器来回收。原创 2024-03-01 18:25:02 · 349 阅读 · 0 评论 -
静态常量池 运行时常量池 字符串常量池的区别
这意味着,如果两个String对象都是由相同的字符串常量初始化而来,它们将会共享相同的字符串常量池中的实例,并且它们的内存地址也相同。符号引用:通过符号表示类,如果new一个对象,则在字节码文件的代码中,出现的是其符号引用。但需要注意的是,如果字符串是通过构造函数创建的,而不是直接通过字符串常量赋值的方式创建的话,那么它们就不会在字符串常量池中共享相同的实例,即使它们的内容相同。,它们都是由相同的字符串常量"123"初始化而来,因此它们将共享相同的内存地址。的内容相同,但是它们是通过构造函数创建的,原创 2024-03-01 16:34:51 · 413 阅读 · 0 评论 -
黑马程序员JVM系列学习——Java类的生命周期
首先类加载器通过不同渠道加载类,加载后Java虚拟机将字节码中的信息保存到方法区中,生成一个InstanceKlass对象,保存类的所有信息。同时,Java虚拟机会在堆中生成一份与方法区中数据类似的java.lang.Class对象(反射时获取的对象,详见Java进阶——反射篇),作用是在Java代码中去获取类的信息以及存储静态字段的数据(JDK8之后静态数据存放在堆中)。原创 2024-02-28 20:36:30 · 396 阅读 · 1 评论 -
Java进阶——反射(一):认识反射、获取类
1.加载类,获取类的字节码,Class对象,将类的字节码文件加载到内存中。(Java中一切皆对象,每个类在JVM中都会有一个Class类型的对象,包含类的结构信息、方法、字段、构造器等)如IDEA的自动提示, 一个对象,输入.会自动提示出成员变量、成员方法,就是用到了反射。反射:加载类,并允许以编程的方式剖解类中的各种成分(成员变量、方法、构造器等)。获取到Class对象后可进行其他操作,如获取类名、构造器等等。4.获取类的成员方法,Method对象。3.获取类的成员变量,Field对象。原创 2024-02-27 17:59:25 · 313 阅读 · 0 评论 -
Java进阶——单元测试
3.测试方法上必须声明@Test注解,然后在测试方法中调用业务方法。(写完@Test后Alt加回车,即可添加Junit框架)2.对于需要测试的业务类,定义对应的测试列,为每个业务方法编写对应的测试方法。(测试方法必须公共、无参、无返回值)。1.将Junit框架的jar包导入项目中(IDEA已经集成了,不需要手动导入)。单元测试:针对最小的功能单元编写方法进行正确性测试。4.在测试类中可以直接运行,通过则为绿色否则为红色。方法:使用Junit框架。原创 2024-02-27 10:22:44 · 434 阅读 · 0 评论 -
黑马程序员JVM系列学习——面试:类加载器总结
每个Java实现的类加载器中保存了一个成员变量叫做父类加载器,自底向上查找是否加载过,再自顶向下进行加载,避免核心类被应用程序重写并覆盖,提升了安全性。启动->扩展->应用程序->自定义。原创 2024-02-29 15:17:52 · 336 阅读 · 0 评论 -
黑马程序员JVM系列学习——运行时数据区(二)
上面s1,s2位栈中局部变量,s1为new创建,存放在堆中的地址,s2存放字符串常量池中的地址。所以s1和 s2不是同一个内存地址。字符串常量池和运行时常量池的关系:早期设计时,字符串常量池属于运行时常量池的一部分,存储位置也是一致的。后面做出了拆分。JDK8之后运行时常量池变为元空间中,字符串常量池在堆中。上述代码c与d的地址不想等,d获取到1,2后,使用StringBuilder,底层调用append变为12,存放到堆内存中,而c存放在字符串常量池,所以不相等。原创 2024-03-01 15:53:59 · 373 阅读 · 0 评论 -
黑马程序员JVM系列学习——运行时数据区(一)
线程不共享:每个线程都会有一份程序计数器,Java虚拟机栈,本地方法栈对应的数据,别的线程无法访问,安全性高。线程共享:每个线程都可以获取方法区和堆区的数据。原创 2024-02-29 21:54:04 · 380 阅读 · 0 评论 -
Java进阶——注解(二):元注解以及注解的解析
元注解:修饰注解的注解注解的解析:判断类上、方法上、成员变量上是否存在注解,并把注解里的内容解析出来。原创 2024-02-28 13:32:45 · 366 阅读 · 1 评论 -
Java进阶——反射(二):获取类的构造器及其作用
调用上述方法后会将类的每一个构造器封装成Constructor对象,然后将这些对象放到构造器数组里。获取有参构造器时要加上.Class,加上后才表示类型的意思。原创 2024-02-27 18:20:12 · 367 阅读 · 0 评论 -
Java进阶——反射(四):反射的作用及应用场景
主流的框架都会基于反射设计出一些通用的功能,如一个框架需要将所有对象的字段名和值保存到文件中去,不使用反射需要针对每一个类编写不同的程序,因为不同的类含有不同的字段。使用反射可以接受对象然后获取全部成员变量,遍历成员变量获取其值,将成员变量和值存储到文件中去即可。1.可以得到一个类的全部成分然后操作。3.适合做Java的框架。2.可以破坏封装性。原创 2024-02-28 09:29:12 · 460 阅读 · 1 评论 -
Java进阶——反射(三):获取类的成员变量及成员方法
set函数需要一个对象以及所赋的值,成员变量不能若离对象独立存在,必须属于某一个对象。获取的成员变量的作用:依然是赋值、取值。获取成员方法的作用:依然是执行。原创 2024-02-27 18:35:30 · 399 阅读 · 0 评论 -
黑马程序员JVM系列学习——双亲委派机制
启动类加载器、扩展类加载器、应用程序类加载器加载不同目录下是文件,若一个文件同时分配到上述三个目录,则该文件由哪个加载器加载呢?——双亲委派机制:核心是解决一个类到底是由谁加载的问题。原创 2024-02-29 10:56:20 · 343 阅读 · 0 评论 -
黑马程序员JVM系列学习——JDK9之后的类加载器
JDK8及之前,扩展类加载器和应用程序类加载器的源码位于rt.jar包中的sun.misc.Launcher.java。1.启动类加载器使用Java编写,位于jdk.internal.ClassLoaders类中。JDK9引入了module的概念,类加载器在设计上发生了很多变化。2.扩展类加载器被替换成平台类加载器。原创 2024-02-29 15:09:22 · 416 阅读 · 0 评论 -
黑马程序员JVM系列学习——类加载器的分类
类加载器分为两类,一类是Java代码实现,一类是Java虚拟机底层源码实现的底层源码实现:加载程序运行时的基础类Java语言实现(JDK中提供或自定义):继承自抽象类ClassLoader。原创 2024-02-29 10:23:33 · 364 阅读 · 0 评论 -
黑马程序员JVM系列学习——打破类的双亲委派机制的三种方式
例如Tomcat中,若有两个应用,需要分别调用两个类,这两个类名字相同,但是内容不同,第一个可以成功加载,但是第二个会加载失败,重复,返回第一个类的对象。Tomcat使用自定义类加载器来实现应用之间的隔离。每一个应用之间会有一个独立的类加载器加载对应的类,不再去向上委拍派,向下加载的双亲委派机制了。原创 2024-02-29 12:46:31 · 577 阅读 · 0 评论 -
Java进阶——动态代理
原创 2024-02-28 18:35:39 · 329 阅读 · 1 评论 -
Java进阶——注解(一):认识注解
注解:Java代码里的特殊标记,如@Override(检查重写是否成功),@Test(加了注解需要执行该测试方法)等,作用为让其他程序根据注解信息来决定怎么执行该程序。原创 2024-02-28 09:42:45 · 379 阅读 · 1 评论 -
Java进阶——注解(三):注解的应用场景
注解:结合反射等技术做框架。原创 2024-02-28 13:40:19 · 374 阅读 · 1 评论