![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM学习
romantic_jie
学无止境,静无止学!!!
展开
-
简单实现一个自定义类加载器
前言:本文只为作者练习使用,后续复习使用。package com.MyCustomizeClassLoaderTest;import java.io.FileInputStream;/** * 实现自定义类加载器,需要继承java.lang.ClassLoader * 然后根据ClassLoader内的loadClass()方法的逻辑: * 我们需要重写 findClass()方法,实现自己的类加载器 * * 重写findClass()是为了不破坏loadClass()中的 .原创 2020-08-07 20:20:52 · 336 阅读 · 1 评论 -
根据配置CLASSPATH彻底弄懂AppCLassLoader的加载路径问题
1.前言 相信任何使用JAVA语言的开发者,都会在一台新的PC上去装上JDK,JRE,用来可以编译我们所写的.java文件,然后让其生成编译后的.class文件,从而能够争取执行。。。有兴趣可以简单了解一下JDK和JRE的作用。 当我们装上JDK的时候,相信大家还会经历非常重要的一步,就是配置环境变量。并且,毫不避讳的说,初次接触java的初学者,总是在配置环境变量的时候,一头雾水,那我们今天就来以配置环境变量为问题切入点,彻底搞懂他究竟涉及到哪些比较核心的问题-----类加载器。。。2.问..原创 2020-08-07 17:37:29 · 5956 阅读 · 11 评论 -
JAVA中Class.forName()和ClassLoader.loadClass()对比
先上代码抛出问题:package com.myClassLoaderTest;/** * 用于对比的测试类 * 1.该类中有静态代码块。 * 2.测试Class.forName和classLoader的不同 * * 测试结果 * * @ Author: liu xuanjie * @ Date: 2020/7/29 */public class TestObject{ public static int value = 1; public TestO原创 2020-07-29 12:41:10 · 341 阅读 · 0 评论 -
Java内存区域
java虚拟机在执行java程序的过程中会把他所管理的内存划分为若干个不同的内存区域。1.程序计数器:线程私有的! 程序计数器是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器。 由于java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程中的指令。因此,为了线程...原创 2019-06-03 21:55:57 · 112 阅读 · 0 评论 -
JVM--类加载器&&双亲委派模型
虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机的外部去实现,以便让应用程序自己决定如何去获取所需要的类,实现这个动作的代码模块成为“类加载器”;类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用却远远不限于类加载阶段。对于任意一个类,都需要由加载他的类加载器和这个类本身一同确定其在java虚拟机中的唯一性,每一个...原创 2019-06-09 19:20:35 · 673 阅读 · 0 评论 -
JVM--类加载机制--clinit()方法
从某种角度来说,类加载过程的初始化阶段,就是执行clinit方法的过程。那么这里记录学习一下clinit方法的生成,细节和特点:①<clinit>()方法是由编译器自动收集类中的所有类变量(静态成员变量)的赋值动作和静态程序块(static{})中的语句合并产生的,编译器收集的顺序是由语句在源文件总出现的顺序决定的,静态语句块中只能访问到定义在静态语句块之前的变量,定义在其之后...原创 2019-06-08 18:57:06 · 1019 阅读 · 0 评论 -
JVM--类加载机制--加载过程
加载过程涉及到类生命周期的前五个部分,即 加载,验证,准备,解析,初始化。1.加载在加载阶段,虚拟机完成以下三个事情:①通过一个类的全限定名类获取定义类的二进制字节流②将这个字节流所代表的静态存储结构,转化为方法区的运行时数据结构(运行时常量池)。③在内存中生成一个代表这个类的java.lang.Class对象(参考其他博客),作为方法区这个类的各种数据的访问入口。2.验证...原创 2019-06-08 18:32:48 · 131 阅读 · 0 评论 -
JVM--类加载机制--加载时机
虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制!在Java语言里面,类型的加载,连接和初始化过程都是在程序运行期间完成的,这种策略虽然会使类加载时稍微增加一些性能开销,但是会为Java应用程序提供高度的灵活性,Java里天生可以动态扩展的语言特性就是依赖运行期间动态加载和动态连接这个特点实...原创 2019-06-08 18:02:52 · 151 阅读 · 0 评论 -
JVM--内存分配与回收策略
Java技术体系中所提倡的自动内存管理最终可以归结为自动化的解决了两个问题:给对象分配内存以及回收分配的内存这里学习记录几条普遍的内存分配规则:先来说明两个概念:①新生代GC(Minor GC):指发生在新生代的垃圾收集动作,因为Java对象大多数都具备朝生夕灭的特点,所以Minor GC非常频繁,一般回收速度也比较快。②老年代GC(Major GC / Full GC):指发生在...原创 2019-06-07 19:46:02 · 136 阅读 · 0 评论 -
JVM垃圾处理相关--垃圾收集算法
首先明确该部分所说的垃圾收集只是针对java堆区域的。1.标记-清除算法(Mark-Sweep): 最基础的算法,其他回收算法,都是基于他的缺点进行改进 分为两个阶段: ①首先标记出所有需要回收的对象(可达性分析算法) ②在标记完成后,统一回收所有被标记的对象。 两个严重缺陷: ①效率问题,标记和清除两个过程的效率都不高; ②空间问题,标记...原创 2019-06-07 18:10:06 · 157 阅读 · 0 评论 -
JVM垃圾处理相关--四种引用
在 JDK 1.2 之后,Java对引用的概念进行了扩充,将引用分为强引用,软引用,弱引用,虚引用四种四种引用的强度依次减弱。1.强引用 就是指在程序代码中普遍存在的,类似“Object obj = new Object()”这类的引用,只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象。2.软引用 是用来描述一下还有用但并非必需的对象。对于软引用关联着的对象,在系统将...原创 2019-06-05 22:46:19 · 117 阅读 · 0 评论 -
JVM垃圾处理相关--对象已死吗
在堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确认这些对象之中哪些还“存活”着,哪些已经“死去”(即不可能再被任何途径使用的对象)1.引用计数算法给对象添加一个引用计数器,每当有一个地方引用它的时候,计数器就加1;当引用失效的时候,计数器就减1;任何时刻计数器为0的对象就是不可能在被使用的。客观的说,引用计数算法的实现简单,判定效率也很高,...原创 2019-06-05 22:35:15 · 102 阅读 · 0 评论 -
java中的finalize方法学习记录
程序员都了解初始化的重要性,但常常会忘记同样重要的清除工作。毕竟,谁需要清除一个int 呢?但在使用程序库时,把一个对象用完后就“弃之不顾”的做法并非总是安全的。当然,Java有垃圾回收器来回收无用对象占据的内存资源。但也有特殊情况:假定你的对象(并非使用 new)获得了一块“特殊”的内存区域,由于垃圾回收器只知道释放那些经由 new分配的内存,所以它不知道该如何释放该对象的这块 “特殊”内存。...转载 2019-05-06 21:36:58 · 120 阅读 · 0 评论 -
简单理解 java.lang.Class
这个Class到底是什么?一句话,java.lang.Class他就是个类。跟Object,String或者我们自己定义一个Student,都是一样的。那这个类是干什么的呢?还是一句话,类就是一种类型,是某一种实例抽象出来的一个概念。如果你定义了一个学生类Student,你可以实例化创建出,张三,李四,王五等等不同的具体实例。那对于Class类来说呢?他是哪一种抽象呢?很简单,他就是j...原创 2019-05-06 21:35:39 · 1083 阅读 · 0 评论