
jvm
文章平均质量分 91
我不是臭弟弟
好吃懒做 无所不为
展开
-
Tomcat打破双亲委派
复习复习JVM类加载机制,再谈谈 Tomcat 的类加载器如何打破 Java 的双亲委托机制。JVM 的类加载器Java 的类加载,就是把字节码格式“.class”文件加载到 JVM 的方法区,并在 JVM 的堆区建立一个java.lang.Class对象的实例,用来封装 Java 类相关的数据和方法。那 Class 对象又是什么呢?你可以把它理解成业务类的模板,JVM 根据这个模板来创建具体业务类对象实例。JVM 并不是在启动时就把所有的“.class”文件都加载一遍,而是程序在运行过程中用到了这个原创 2021-05-16 23:12:29 · 418 阅读 · 1 评论 -
再谈引用
强引用:最传统的“引用”的定义,是指在程序代码之中普遍存在的引用赋值,即类似“Object obj = new Object()”这种引用关系。无论任何情况下,只要强引用关系还存在,垃圾收集器就永远不会回收掉被引用的对象。软引用:在系统将要发生内存溢出之前,将会把这些对象列入回收范围之中进行第二次回收。如果这次回收还没有足够的内存,才会抛出内存溢出异常。弱引用:被弱引用关联的对象只能生存到下一次垃圾收集之前。当垃圾收集器工作时,无论内存空间是否足够,都会回收掉被弱引用关联的对象。虚引用:一个对象是否.原创 2020-09-09 20:22:13 · 187 阅读 · 0 评论 -
为什么jvm不使用引用计数算法来判断对象是否已经死亡
在堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着 ,哪些已经“死去”(即不可能再被任何途径使用的对象)。引用计数算法很多教科书判断对象是否存活的算法是这样的:给对象中添加一个引用计数器,每当有—个地方引用它时,计数器值就加1 ; 当引用失效时,计数器值就减1 ; 任何时刻计数器为0的对象就是不可能再被使用的。客观地说,引用计数算法( Reference Counting ) 的实现简单,判定效率也很高,在大部分情况下它都是一个原创 2020-09-07 16:01:33 · 785 阅读 · 0 评论 -
jvm垃圾回收三种算法对比
Mark-Sweep(标记-清除)Mark-Compact(标记-整理)Copying(复制)速度中等最慢最快空间开销少(但会有堆积碎片)少(不堆积碎片通常需要活对象的2倍大小(不堆积碎片)移动对象否是是效率上讲,复制算法是当之无愧的老大,但是浪费了太多的内存。而为了尽量兼顾上面提到的三个指标,标记-整理算法相对更平滑一些,但是效率上不如人意,它比复制算法多了一个标记的阶段,比标记-清除算法多了一个整理内存的阶段。...原创 2020-09-05 21:26:59 · 442 阅读 · 1 评论 -
可达性分析算法
可达性分析算法所谓“GC Roots”根集合就是一组必须活跃的引用。基本思路可达性分析算法是以根对象集合(GC Roots)为起始点,按照从上至下的方式搜索被根对象集合所连接的目标对象是否可达。使用可达性分析算法后,内存中的存活对象都会 被根对象集合直接或者间接连接着,搜索所走过的路径称为引用链(Reference Chain)如果目标对象没有任何引用链相连,则是不可达的,就意味着该对象已经死亡,可以标记为垃圾对象在可达性分析算法中,只有能够被根对象集合直接或者间接连接的对象才是存活对原创 2020-09-05 14:24:35 · 1903 阅读 · 0 评论 -
intern()的使用:jdk6 vs jdk7/8
总结String的intern()的使用:jdk1.6中,将这个字符串对象尝试放入串池。如果串池中有,则并不会放入。返回已有的串池中的对象的地址如果没有,会把此对象复制一份,放入串池,并返回串池中的对象地址。jdk1.7开始,将这个字符串尝试放入串池。如果串池中有,则并不会放入。返回已有的串池中的对象的地址如果没有,则会把对象的引用地址复制一份,放入串池,并返回串池中的引用地址。...原创 2020-08-28 21:49:46 · 159 阅读 · 0 评论 -
字符串常量池StringTable
1、String的基本特性String:字符串,使用一对""引起来表示。String s1 = "zty";//字面量的定义方式 String s2 = new String("hello");String声明为final的,不可被继承String实现了Serializable接口:表示字符串是支持序列化的。实现了Comparable接口:表示String可以比较大小String在jdk8及以前版本内部定义了final char[] value用于存储字符串数据。jdk9时改为by原创 2020-08-07 01:01:51 · 454 阅读 · 0 评论 -
JVM内存分配策略(或对象提升(Promotion)规则)
针对不同年龄段的对象分配原则如下所示:优先分配到Eden大对象直接分配到老年代(尽量避免程序中出现过多的大对象)长期存活的对象分配到老年代动态对象年龄判断(如果Survivor区中相同年龄的所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象可以直接进入老年代,无需等到MaxTenuringThreshold中要求的年龄)空间分配担保(-XX:HandlePromotionFailure)...原创 2020-07-30 00:07:48 · 229 阅读 · 0 评论 -
jdk源码学习——你真的了解Object源码吗
前言Object应该算是比较简单的源码了。Object是类层次结构的根,Java体系里面的每个类默认都有一个超类就是 Object。总之,所有对象,包含数组,都默认实现该类的方法。主体框架native关键字因为 Object 类里面有很多地方都用到 native 关键字。我们先了解一下这家伙。native 关键字是 JNI(Java Native Interface)的重要体现。什么是 JNI ,JNI 是Java调用其他语言(c,c++) 的一种机制。native 关键字修饰的是方法,起声明作用原创 2020-07-17 00:26:53 · 183 阅读 · 0 评论 -
volatile很难?由浅入深怼到CPU汇编,彻底搞清楚它的底层原理
Tips:但凡是个像样的公司面试官都得问对volatile关键字理解以及其实现原理。虽然多多少少知道一些,但是问深了,终究感觉还是差了那么一点,所以这次我要把这个关键字来学个通透!本文记录个人学习volatile。主要包含以下内容,力求简单明了:1、一段代码来演示问题背景2、volatile解决内存可见性问题3、Java内存模型原子操作4、总线加锁太慢?MESI缓存一致性协议(总线嗅探机制)5、彻底掌握volatile底层原理1、多线程环境下共享变量的线程安全问题package volati原创 2020-07-06 16:11:20 · 459 阅读 · 0 评论 -
JVM类加载机制
前言众所周知,在Class文件中描述的各类信息,最终都需要加载到虚拟机中之后才能被运行和使用。类加载的时机一个类型从被加载到虚拟机内存开始,到卸载出内存为止,他的生命周期将会经历加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)七个阶段,其中验证、准备、解析三个部分统称为连接(Linking)。这七步的发生顺序如下:加载——>验证——&g原创 2020-06-22 13:14:57 · 121 阅读 · 0 评论 -
Java中的Class类
Class类简介在java世界里,一切皆对象。从某种意义上来说,java有两种对象:实例对象和Class对象。每个类的运行时的类型信息就是用Class对象表示的。它包含了与类有关的信息。其实我们的实例对象就通过Class对象来创建的。Java使用Class对象执行其RTTI(运行时类型识别,Run-Time Type Identification),多态是基于RTTI实现的。每一个类都有一个Class对象,每当编译一个新类就产生一个Class对象,基本类型 (boolean, byte, char, s原创 2020-05-31 17:33:44 · 310 阅读 · 0 评论