
JVM
文章平均质量分 67
toward_south
自律给人自由
展开
-
SPI 服务发现机制不生效
我们的 SPI 服务理论是应该通过webapp 这加载器去加载的,但是因为使用了ForkJoinPool ,这时候通过线程上下文加载器,拿到的加载器就是一个Bootstrap ,而这玩意是无法去加载SPI的。这方法来设置,如果创建线程的时候没设置,那么它会从父线程中继承一个,如果在应用程序的全局范围内都没有设置过的话,那么这个类加载器默认就是应用程序类加载器。SPI 服务发现机制还是走的类加载器去加载这些服务的,所以,是可以设置上下文线程类加载器来处理。原创 2022-09-08 17:24:30 · 833 阅读 · 0 评论 -
JVM-类加载时机
1、类的生命周期类的生命周期有这七个阶段,加载 -> 验证 -> 准备 -> 解析 -> 初始化 -> 使用 -> 卸载,具体如下图所示:其中加载、验证、准备、初始化和卸载顺序是确定的,类加载必须按照这个顺序开始,但解析阶段可能存在在初始化之后才开始,如Java语言的运行时绑定。需要注意的是,这几个阶段有可能是交替进行的,并不是一一按顺序来执行,等待一个阶段结束,另外一个阶段才开始。2、什么时候开始当真正使用主动引用到类的时候,才会触发类加.原创 2022-03-13 10:08:44 · 1096 阅读 · 0 评论 -
JVM-类加载过程
类加载共有五个阶段,这里逐一说说每个阶段主要干了啥1、加载加载阶段需要完成这三件事:通过类的完全限定名称获取定义该类的二进制字节流。 将该字节流表示的静态存储结构转换为方法区的运行时存储结构。 在内存中生成一个代表该类的 Class 对象,作为方法区中该类各种数据的访问入口。(该class对象放在方法区,并不是放在堆里)其中二进制字节流可以从以下方式中获取:从 ZIP 包读取,成为 JAR、EAR、WAR 格式的基础。 从网络中获取,最典型的应用是 Applet。 运行时计算生原创 2022-03-13 10:06:47 · 143 阅读 · 0 评论 -
JVM-类加载器
1、类加载的分类引导类加载器(bootstrap class loader):用来加载Java的核心库,原生代码实现,并不继承java.lang.ClassLoader 。扩展类加载器(extensions class loader): 用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,原创 2022-03-13 10:04:15 · 1253 阅读 · 0 评论 -
关于类加载的某个问题的思考
在看虚拟机一书过程中看到的问题: 如果有10个WEB应用程序都是用Spring来进行组织管理的话,可以把Spring放到Common或Shared目录(Tomcat5.0)让这些程序共享。Spring要对用户程序的类进行管理,自然要能访问到用户程序的类,而用户程序显然是放在/WEB-INF目录中的。那么被CommonClassLoader或SharedClassLoader加载的Spring如何访问并不在其加载范围内的用户程序呢? 类A,使用A加载器, 在类A里边加载其他类这时...原创 2022-03-13 09:58:24 · 837 阅读 · 0 评论 -
JDK自带的故障处理工具
前言:用来记录jdk自带的几个处理工具,知道有这几个东西,等有需要的时候再去具体学习使用。1、jps 虚拟机进程状况工具功能:可以列出正在运行的虚拟机进程,并显示虚拟机执行Main类名称及这些进程的本地虚拟机唯一ID(LVMID)。命令:jps [options ] [ hostid ]jps -q:只输出LVMID,省略主类的名称jps-m:输出虚拟机进程启动时传递给主类的参数jps-l:输出主类的全名,如果进程时Jar,则输出其路径jps-v:输出虚拟机进程启动.原创 2021-01-11 22:58:24 · 501 阅读 · 1 评论 -
垃圾收集器
1、概览目前HotSpot垃圾收集主要分为两类,分区收集和分代收集,如下图所示:下面将分别介绍这些收集器的特点。2、分代收集器2.1、Serial 收集器特点:1、是一个单线程的收集器,使用该收集器时必须暂停其他所有的工作线程(stop the world,目前许多文章简称为STW)。2、用于Client模式下新生代的垃圾收集,简单而高效运行示意图:2.2、ParNew收集器特点:1、是Serial收集器的多线程版本。2、是S...原创 2021-01-11 22:56:19 · 125 阅读 · 1 评论 -
判断对象是否存活
1、引用计数法原理:给对象加个引用计数器(计数器是放在对象头的),每当在其他地方引用该对象时,计数器加1,引用失效-1,如果计数器为0,表明该对象已经不可用了,也就是不是存活对象了,下一步就该回收了。使用情况:目前主流的Java虚拟机并没有使用引用计数法来管理内存,书上说的是很难解决对象间的相互引用问题。但也只是说很难解决,发展到现在,其实是可以解决的,可以通过Recycler算法来进行解决,但只是在多线程环境下,引用计数变更也需要进行昂贵的同步操作,性能较低。早期的时候被使用过。2、可原创 2021-01-11 22:52:08 · 213 阅读 · 0 评论 -
垃圾收集算法
1、标记-清除(Mark-Sweep)算法定义:1、顾名思义,该算法经历了两个阶段,第一个阶段就是标记需要回收的对象,第二个阶段就是回收被标记的对象。整个算法在不同的实现中会使用三色抽象(Tricolour Abstraction)、位图标记(BitMap)等技术来提高算法的效率,存活对象较多时较高效。2、用于老年代不足:1、内存空间不规整,标记清除后会存在大量不连续内存碎片。2、效率低(存活对象不多的时候)。2、复制(Copying)算法定义:...原创 2021-01-11 22:49:58 · 179 阅读 · 0 评论 -
HotSpot 虚拟机对象探秘
1、对象创建1、检查该指令(new)是否在常量池中有相关类的符号引用2、检查是否执行过类加载的过程。3、类加载完成后,分配内存,分配内存有两种方法 3.1、指针碰撞,前提是Java堆中内存是绝对规整的, 用过的内存在一边,没用过的在另外一边,分配内存的时候就把指针往没用过的那一边挪动和对象大小相同的距离。 3.2、空闲链表,在Java堆内存不规整的时候使用,链表记录空闲内存,分配内存的时候,从链表找到符合内存大小的空间。4、对象创建是个频繁的过程,需要考虑多线程的情况,...原创 2021-01-11 22:43:06 · 95 阅读 · 0 评论 -
Java内存区域
前言:如果没特殊说明,均以HotSpot虚拟机为例。运行时的数据区域:先看看1.8之前和1.8之后运行时的数据区域1.8之前1.8及之后主要区别:元空间:1.8之后替代了方法区,但是元空间这时候已经放在了本地内存,优点而言,内存更大了,只是受本地内存影响下面分别讲下各个数据区1.1、程序计数器1、是一块比较小的内存区域,可以看作当前线程所执行的字节码的行号指示器。2、帮助线程切换后能恢复到正确的执行位置3、是线程私有的1...原创 2020-12-09 22:43:44 · 110 阅读 · 0 评论