Java虚拟机笔记-类的卸载
jvm类的卸载
当MySample类被加载,连接和初始化后,它的生命周期就开始了。当代表MySample类的Class对象不再被引用,即不可触及时,Class对象就会结束生命周期,MySample类在方法区内的数据也会被卸载,从而结束MySample类的生命周期。
一个类何时结束生命周期,取决于代表它的Class对象何时结束生命周期。
由Java虚拟机自带的加载器所加载的类,在虚拟机的生命周期中,始终不会被卸载。Java虚拟机自带的类加器包括根类加载器,扩展类加载器和系统类加载器。Java虚拟机本身会始终引用这些类加载器,而这些类加载器则会始引用它们所加载的类的Class对象,因此这Class对象终是可及的。
由用户自定义的类加载器所加载的类是可以被卸载的。
Sample类中由loader1加载。在类加载器的内部实现中,用一个Java集合来存放所加载类的引用。另一方面,一个Class对象总是会引用它的类加载器,调用Class对象的getClasslodar()方法,就能获得它的类加载器。此可见,代表Sample类的Class实例与loader1之间为双向关取关系。一个类的实例总是 ...
线段树模板
「LYOI2018 Summer」Hzy’s Rabbit Array
参考:
wyy603
「LYOI2018 Summer」Hzy’s Rabbit Array
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169# ...
Java虚拟机笔记-自定义类加载器
jvm自定义类加载器
JDK加载类流程参考:https://juejin.im/post/5a1fad585188252ae93ab953
loadClass123456789101112131415161718192021222324252627282930313233343536373839404142protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException{ synchronized (getClassLoadingLock(name)) { /** * 1.检查类是否已经加载过 * @param name 类的二进制名字 * @return 类对象(Class<?>),如果没有加载该类,则返回null */ Class c = findLoadedClass(name); if (c == nu ...
容斥与抽屉定理
容斥与抽屉定理
容斥定理定理参考:百度百科
在计数时,必须注意没有重复,没有遗漏。为了使重叠部分不被重复计算,人们研究出一种新的计数方法,这种方法的基本思想是:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复,这种计数的方法称为容斥原理。
两个集合的容斥关系公式:A∪B =|A∪B| = |A|+|B| - |A∩B |(∩:重合的部分)
三个集合的容斥关系公式:|A∪B∪C| = |A|+|B|+|C| - |A∩B| - |B∩C| - |C∩A| + |A∩B∩C|
例如三个集合的关系:
(图里面的A+B+C划红色部分应该是划去{2,3,4,2,1,2},即划去A∩B,B∩C,A∩C)
一般情况:
51nod1284
容斥定理,先求反面,即1-N有多少是2 3 5 7的倍数,然后再用总数减去反面的数量即为所求。
1cnt = A2+A3+A5+A7-(A23+A25+A27+A35+A37+A57)+(A235+A237+A257+A357)-A2357
A2表示被2整除的个数 ...
Java虚拟机笔记-ClassLoder部分文档解读
ClassLoder部分文档解读
Documentation123java.lang public abstract class ClassLoaderextends Object
123A class loader is an object that is responsible for loading classes. The class ClassLoader is an abstract class. Given the binary name of a class, a class loader should attempt to locate or generate data that constitutes a definition for the class. A typical strategy is to transform the name into a file name and then read a "class file" of that name from a file system.一个类加载器是一个对象,负责加载类。类Clas ...
Java虚拟机笔记-类加载器双亲委托派制2
继续学习jvm类加载器双亲委派机制
循环获得ClassLoader1234567891011121314151617181920public class Main{ public static void main(String[] args) throws Exception{ //获取系统类加载器 ClassLoader classLoader = ClassLoader.getSystemClassLoader(); System.out.println(classLoader); System.out.println("-------------------"); while(null != classLoader){ //获取加载器的父亲 classLoader = classLoader.getParent(); System.out.println(classLoa ...
Java虚拟机笔记-java虚拟机类加载2
继续学习jvm类的加载
类的加载
类一定是由类加载器加载但是
类的加载的最终产品是位于内存中的class对象
class对象封装了类在方法区内的数据结构,并且向java程序员提供了访问方法区内的数据结构的接口
类加载器并不需要等到某个类被“首次主动使用”时再加载它
预加载
jvm规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了class文件缺失或存在错误,类加载器必须在程序首次主动使用该类时才报告错误(LinkageError错误)
如果这个类一直没有被程序主动使用,那么类加载器就不会报告这个错误
类的加载器类加载器用来把类加载到java虚拟机中。从jdk1.2版本开始,类的加载过程采用父亲委托机制,这种机制能更好保证java平台的安全。在此委托机制中,除了java虚拟机自带的根类加载器以外,其余的类加载器都有且只有一个父加载器。当java程序要求加载loader1加载Sample类时,loader1首先委托自己的父加载器去加载Sample类,若加载器能加载,则由父加载器完成加载任务,否则才由加载器loader1本身记载Sample类 ...
Java虚拟机笔记-类加载器双亲委托派制
jvm类加载器双亲委派机制
并不是所有的jvm虚拟机都使用这个机制,只是大部分,比如还有使用osgi的。
双亲委任模型不是一个强制性的约束模型,而是一个建议型的类加载器实现方式。在Java的世界中大部分的类加载器都遵循者模型
类加载器的双亲委派机制在双亲委派机制中,各个加载器按照父子关系形成了树形结构(逻辑意义),除了根类加载器之外,其余的类加载器都有且有一个父加载器
根类加载器和扩展类加载器只能加载指定路径的里面的类,而系统类加载器一般可以加载我们工程中所定义的类
根类加载器:由c++实现,不是ClassLoader子类
扩展类加载器:由sun.misc.Launcher$ExtClassLoader实现
(代表ExtClassLoader是sun.misc.Launcher的一个内部类)
系统类加载器:由sun.misc.Launcher$AppClassLoader实现
过程实例
Loder1与Loader2是用户自定义的类加载器,两者之间又形成了父子关系
Loder1想要加载我们编写的Sample类,根据类加载器的双亲委派机制,并不是由Loader1直接加载到 ...
单调栈
单调栈及poj2559
单调栈什么是单调栈?顾名思义,单调栈首先是一个栈,并且栈内的元素的大小按照他们所在栈内的位置,满足一定的单调性。
比如有一数组{1,3,232,23,24,3324,-1},维护其单调递减栈,数组左边为栈顶
首先,栈为空,入栈[1]
到下一个元素3,因为3>1,所以入栈,此时栈[3,1]
接着下一个元素232,因为232>3,所以入栈,此时栈[232,3,1]
接着下一个元素23,因为232<23,所以232出栈,此时栈[3,1],因为3<23,所以入栈,此时栈[23,3,1]
接着下一个元素3324,因为3324>23,所以入栈,此时栈[3324,23,3,1]
接着下一个元素-1,因为3324>-1,所以出栈,此时栈[23,3,1],因为23>-1,所以出栈,此时栈[3,1],因为3>-1,出栈,此时栈[1],因为1>-1,出栈,此时栈为空,将-1入栈,此时栈[-1]
模板题—poj2559
解析参考:https://www.zybuluo.com/Chilling/note/633014
题意:给出几 ...
单调队列
单调队列及其优化dp
单调队列poj2823—Sliding Window
大意:给你一个长度为N的数组,一个长为K的滑动的窗体从最左移至最右端,你只能见到窗口的K个数,每次窗体向右移动一位,你的任务是找出窗体每个时刻中的最大值与最小值
优先队列优先队列能够进行排序,窗口往右一位,就把一个元素放到队列里面,然后每次取队首元素,如果队首元素的id在这个框的范围内的话,那么就取队首,如果不是的话那么就出队,找下一个队首元素,时间复杂度为O(nlogn)
对优先队列改良—单调队列O(n)基本思想:同样维护队首元素作为答案,去掉多余的元素(维护单调性)
因为是求最大值,所以维护一个单调递减队列,其队首就是最大值,就是我们想要的答案
L
L+1
……
R-1
R
编号
A[L]
A[L+1]
……
A[R-1]
A[R]
值
B[L]
B[L+1]
……
B[R-1]
B[R+1]
上面单调递减队列满足:
A[i+1]>A[i]>A[i-1] && B[i-1]>B[i]>B[i+1](R>i>L)
单调队列里 ...