字符串 & 堆 & 方法区
摘要:字符串 & 堆 & 方法区 1. 问题引入 package com.learn.java; /** * @author xzy * @date 2020-09-17 22:33 * 说明:字符串 & 堆 & 方法区 */ public class Main { public static Strin
阅读全文
finally 与 return
摘要:finally 与 return 代码1 public class Main2 { public static void main(String[] args) { System.out.println("方法返值为:" + Main2.test()); } public static int te
阅读全文
热点探测
摘要:热点探测 当虚拟机发现某个方法或代码块运行的特别频繁时,就会把这些代码认定为“热点代码”(Hot Spot Code)。 判断一段代码是不是热点代码的这种行为被称为“热点探测”(Hot Spot Detection),目前主流的热点代码判定方法有两种,分别如下: 基于采样的热点探测(Sample B
阅读全文
静态类型与函数重载
摘要:静态类型与函数重载 有以下代码: public class Main { public static class Human {} public static class Man extends Human {} public static class Woman extends Human {}
阅读全文
局部变量与类变量的赋值与使用
摘要:局部变量与类变量的赋值与使用 现象 public class Main { // 类变量 public static int classVariable; public static void main(String[] args) { // 局部变量 int localVariables; Sys
阅读全文
数组定义与类的初始化
摘要:数组定义与类的初始化 SuperClass类: public class SuperClass { public static String staticVariable = "staticVariable"; public static final String STATIC_CONSTANT =
阅读全文
访问类的静态属性与类的初始化
摘要:访问类的静态属性与类的加载 1. 访问类的静态变量 现有SuperClass类,其源码如下: public class SuperClass { public static String staticVariable = "staticVariable"; public static final S
阅读全文
new关键字与类加载
摘要:new关键字与类加载 验证 现有以SuperClass类,其源码如下: public class SuperClass { public static String staticVariable = "hello "; public static final String STATIC_CONSTA
阅读全文
类加载时机说明
摘要:类加载时机说明 类的生命周期 类从被加载到虚拟机内存开始,到卸载出内存位置,它的整个生命周期包含7个阶段:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)、卸载(Unlo
阅读全文
虚拟机类加载机制概述
摘要:虚拟机类加载机制概述 “代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一大步。” 什么是虚拟机的类加载机制? Class文件中存储的各种关于类的描述信息,需要加载到虚拟机中才能运行和使用。 这里所说的“Class文件”指的是一串二进制的字节流,并不仅仅指.clas
阅读全文
Class 类文件的结构
摘要:Class 类文件的结构 Class文件是一组以字节为基础单位的二进制流。Class文件中各个数据项目严格按照顺序紧凑地排列,数据项目之间不存在任何分隔符号,这使得整个Class文件中存储的内容几乎全部是程序运行的必要数据,没有空隙存在。当遇到需要占用1字节以上空间的数据项时,则按照高位在前的方式分
阅读全文
垃圾收集算法_复制算法
摘要:垃圾收集算法_复制算法 为了解决“标记 清除算法”存在的效率和内存碎片问题,“复制算法”出现了。 “复制算法”的基本思想为: 将内存按容量等分为两块,每次只使用其中的一块。 当这一块内存使用完的时候,就将所有存活的对象逐一复制到另一块内存,然后把这一块内存的空间一次性清理掉(只要移动堆指针,按顺序分
阅读全文
标记 - 清除算法
摘要:标记 清除算法 “标记 清除”算法是最基础的垃圾收集算法,如同它的名字一样,算法的工作过程可以分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,然后统一回收所有被标记的对象。 标记待回收对象:使用可达性分析算法筛选出所有没有可达链的对象。若对象覆盖了finalize方法且虚拟机还没有调用
阅读全文
Java对象回收与finalize方法
摘要:生存还是死亡 事实上,即使被可达性分析算法判断为不可达,对象也不是“非死不可”,对象会先进入“缓刑”状态。要真正宣告一个对象死亡,至少要经历两次标记过程: 如果进行可达性分析后发现不存在任何从GC Roots到达对象的引用链,那么对象会被 第一次标记 并且进行进一步的筛选,筛选的条件是:对象是否有必
阅读全文
如何判断对象可以被回收?
摘要:如何判断对象可以被回收? 堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器对堆进行回收前,要做的第一件事情就是确定哪些对象还“活着”,哪些对象已经“死了”(即不可能再被任何途径使用)。 我觉得《寻梦环游记》是一个很棒的电影,让我对人类的死亡有了新的认识:每个人其实都要经历两次死亡——当灵魂和
阅读全文
垃圾收集概述
摘要:垃圾收集概述 1. 垃圾收集(Garbage Collecion,GC)与Java的关系 GC不是Java的伴生产物,事实上,GC具有比Java更悠久的历史。 2. 垃圾收集主要思考的问题——What? When? How? 哪些内存需要回收? 什么时候回收? 如何回收?
阅读全文
对象引用
摘要:对象引用 无论是通过引用计数算法判断对象的引用数量,还是通过可达性分析算法判断对象的引用链是否存在,判定对象是否存活都与“引用”有关。 JDK1.2前 在JDK1.2前,Java对引用的定义很传统:如果reference类型的数据中存储的数值代表的是另外一块内存的起始地址,就称这块内存代表着一个引用
阅读全文
HotSpot虚拟机对象创建
摘要:Java是一门面向对象的语言,在Java程序的运行过程中无时无刻都有新的对象被创建出来。从语言的层面看,创建对象通常仅仅是一个new关键字而已,从虚拟机的角度看,创建对象又是怎样的一个过程呢?
总的来说,对象的创建过程可以大致为:类加载检查→对象内存分配→各字段赋零值→对象头信息设置→初始化
阅读全文
程序计数器为什么是线程私有的?
摘要:1. 程序计数器 1.1. 程序计数器的本质 从本质来看,程序技术器就是一块比较小的内存空间。 1.2. 程序计数器的作用 程序计数器可以看作是当前线程所执行字节码的行号指示器,也就是说,程序计数器这块小空间里面记录的是当前线程正在执行的字节码的行号。字节码解释器通过改变计数器的值来获取下一条要执行
阅读全文