![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java虚拟机
JVM学习笔记
Hello_xzy_Word
学如逆水行舟,不进则退
展开
-
Java异常处理机制中的 finally 与 return
finally 与 return代码1public class Main2 { public static void main(String[] args) { System.out.println("方法返值为:" + Main2.test()); } public static int test() { int number = 1; System.out.println("number被赋值为:" + number);原创 2020-08-06 11:11:18 · 233 阅读 · 0 评论 -
热点探测
热点探测当虚拟机发现某个方法或代码块运行的特别频繁时,就会把这些代码认定为“热点代码”(Hot Spot Code)。判断一段代码是不是热点代码的这种行为被称为“热点探测”(Hot Spot Detection),目前主流的热点代码判定方法有两种,分别如下:基于采样的热点探测(Sample Based Hot Spot Detection)这种探测方法的实现原理是虚拟机周期性的检查各个线程的虚拟机栈的栈顶,如果发现某个方法经常出现在栈顶,那么就认为这个方法是“热点方法”。这种探测方法的优点是原创 2020-07-24 20:35:41 · 678 阅读 · 0 评论 -
静态类型与函数重载
静态类型与函数重载有以下代码:public class Main { public static class Human {} public static class Man extends Human {} public static class Woman extends Human {} public static void sayHello(Human human) { System.out.println("human"); } public原创 2020-07-10 12:26:04 · 247 阅读 · 0 评论 -
局部变量与类变量的赋值与使用
局部变量与类变量的赋值与使用现象public class Main { // 类变量 public static int classVariable; public static void main(String[] args) { // 局部变量 int localVariables; System.out.println(Main.classVariable);//此处正常编译 System.out.pri原创 2020-07-01 08:38:39 · 937 阅读 · 0 评论 -
数组定义与类的初始化
数组定义与类的初始化SuperClass类:public class SuperClass { public static String staticVariable = "staticVariable"; public static final String STATIC_CONSTANT = "STATIC_CONSTANT"; static { System.out.println("SuperClass is loading."); }}原创 2020-06-26 14:00:30 · 205 阅读 · 0 评论 -
访问类的静态属性与类的初始化
访问类的静态属性与类的初始化验证现有SuperClass类,其源码如下:public class SuperClass { public static String staticVariable = "hello "; public static final String STATIC_CONSTANT = "world!"; static { System.out.println("SuperClass is loading."); }}现有原创 2020-06-24 22:35:04 · 228 阅读 · 0 评论 -
分代收集算法
分代收集算法当前所有商用虚拟机都采用“分代收集“(Generational Collection)算法,这种算法根据对象存活周期的不同将内存划分成几块。一般是把Java堆划分为新生代和老年代,这样就可以根据各个代的特点选择最合适的收集算法。新生代:对象存活率低,适用”复制算法“。老年代:对象存活率高且没有额外的空间提供分配担保,适用”标记 - 清除算法“或”标记 - 整理算法“。...原创 2020-05-16 23:17:50 · 387 阅读 · 0 评论 -
标记 - 整理算法
标记 - 整理算法复制算法为什么不适合老年代复制收集算法在对象存活率较高时需要进行较多的复制操作,效率将会降低。更关键的是,如果不想浪费50%的内存空间,就需要提供额外的空间进行分配担保。由于老年代中对象存活率较高,而且找不到其他内存进行分配担保,所以老年代一般不能直接选用这种收集算法。分配担保一般情况下,复制算法将内存空间按照容量划分为两块(如上图所示),两块内存交替使用,当一块内存使用完的时候,就先将存活的对象逐一复制到另一块未使用的内存,然后将当前使用的这块内存一次性清理掉。极端情况下,原创 2020-05-16 23:17:05 · 7265 阅读 · 2 评论 -
垃圾收集算法_复制算法
垃圾收集算法_复制算法为了解决“标记 - 清除算法”存在的效率和内存碎片问题,“复制算法”出现了。“复制算法”的基本思想为:将内存按容量等分为两块,每次只使用其中的一块。当这一块内存使用完的时候,就将所有存活的对象逐一复制到另一块内存,然后把这一块内存的空间一次性清理掉(只要移动堆指针,按顺序分配内存即可)。“复制算法”实现简单、运行高效、解决了内存碎片问题,但是内存缩小了一半。现在的商用虚拟机都采用复制算法来回收新生代。IBM的一项研究表明,新生代中98%的对象是“朝生夕死”的,所以原创 2020-05-14 00:41:41 · 167 阅读 · 0 评论 -
标记 - 清除算法
标记 - 清除算法“标记 - 清除”算法是最基础的垃圾收集算法,如同它的名字一样,算法的工作过程可以分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,然后统一回收所有被标记的对象。标记待回收对象:使用可达性分析算法筛选出所有没有可达链的对象。若对象覆盖了finalize方法且虚拟机还没有调用finalize方法,对象将被加入一个名为F-Queue的队列,后续将由虚拟机创建一个名为Finalizer的线程,逐个执行F-Queue队列每个对象的finalize方法。对象可以在finalize原创 2020-05-14 00:39:28 · 548 阅读 · 0 评论 -
Java对象回收与finalize方法
生存还是死亡事实上,即使被可达性分析算法判断为不可达,对象也不是“非死不可”,对象会先进入“缓刑”状态。要真正宣告一个对象死亡,至少要经历两次标记过程:如果进行可达性分析后发现不存在任何从GC Roots到达对象的引用链,那么对象会被第一次标记并且进行进一步的筛选,筛选的条件是:对象是否有必要执行finalize()方法。若对象没有覆盖finalize()方法,或finalize()方法已经被虚拟机调用过,虚拟机认为对象没有必要执行finalize方法。if(!可达性分析(对象)){ if原创 2020-05-13 20:09:20 · 897 阅读 · 0 评论 -
对象引用
对象引用无论是通过引用计数算法判断对象的引用数量,还是通过可达性分析算法判断对象的引用链是否存在,判定对象是否存活都与“引用”有关。JDK1.2前在JDK1.2前,Java对引用的定义很传统:如果reference类型的数据中存储的数值代表的是另外一块内存的起始地址,就称这块内存代表着一个引用。这种定义很纯粹,但也过于狭隘,对象在这种定义下只有两种状态:被引用和未被引用。JDK1.2后“鸡肋鸡肋,食之无肉,弃之有味”我们希望描述这样一类对象:在内存空间足够时,可以保留在内存中;在内存空间在进行原创 2020-05-13 00:33:08 · 176 阅读 · 1 评论 -
如何判断对象可以被回收?
如何判断对象可以被回收?堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器对堆进行回收前,要做的第一件事情就是确定哪些对象还“活着”,哪些对象已经“死了”(即不可能再被任何途径使用)。我觉得《寻梦环游记》是一个很棒的电影,让我对人类的死亡有了新的认识:每个人其实都要经历两次死亡——当灵魂和肉体分离,这是是第1次死亡;被所有人遗忘,这是第2次死亡,也是彻底的死亡。引用计数算法(Reference Countint)在很多教科书中都介绍了这样一种判别对象是否死亡的算法:为对象添加一个引用计数原创 2020-05-13 00:32:27 · 266 阅读 · 0 评论 -
垃圾收集概述
垃圾收集概述1. 垃圾收集(Garbage Collecion,GC)与Java的关系GC不是Java的伴生产物,事实上,GC具有比Java更悠久的历史。2. 垃圾收集主要思考的问题——What? When? How?哪些内存需要回收?什么时候回收?如何回收?《深入理解Java虚拟机》阅读笔记...原创 2020-05-13 00:29:50 · 235 阅读 · 0 评论 -
HotSpot虚拟机对象创建
2.3.1对象创建Java是一门面向对象的语言,在Java程序的运行过程中无时无刻都有新的对象被创建出来。从语言的层面看,创建对象通常仅仅是一个new关键字而已,从虚拟机的角度看,创建对象又是怎样的一个过程呢?虚拟机遇到一条new指令时,首先将会去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化过。如果没有,必须想执行相应的...原创 2020-02-15 16:54:48 · 108 阅读 · 0 评论