0%

垃圾回收

程序计数器、虚拟机栈、本地方法栈三个区域都是随线程而生,随线程而灭,因此这几个区域的内存分配和回收都是跟随线程的生命周期的,不需要过多的考虑,垃圾回收主要是回收堆空间和方法区的内存

垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾

GC主要作用于堆和方法区,其中大多数是在堆中进行

如何判断一个对象是否应该被回收(垃圾标记算法)

既然要进行回收,那么就需要判断一个对象是否是垃圾,是否应该被回收,判断对象是否存活一般有两种方式:引用计数法可达性分析

阅读全文 »

执行引擎

执行引擎也是JVM中的一个重要组成部分,JVM主要任务是装载字节码,但是字节码并不能直接运行在操作系统上,所以还需要一个可以将字节码翻译成操作系统认识的机器指令的组件,而这个组件就是执行引擎

工作过程

当执行完一条指令后,程序计数器就会更新下一条需要被执行的指令地址,在方法执行过程中,执行引擎也可能会通过存储在局部变量表中的对象引用准确定位到存储在java堆区中的对象实例信息以及通过对象头中的元数据指针定位到目标对象的类型信息

执行引擎流程

阅读全文 »

对象在JVM中的生活

在java中万事万物皆对象,而java是在JVM中进行运行的,那么对象在JVM中是如何运作的呢?我们既要知道对象是怎么来的,也要知道对象是怎么没的

先来看一下我们看到的是如何创建对象的

创建对象的几种方式

有以下几种方式

  • 使用new进行实例化
1
TestObject testObject = new TestObject();
  • 使用Class的newInstance()

主要该方式调用的是无参的构造器,且必须是public的

1
TestObject testObject1 = TestObject.class.newInstance();
阅读全文 »

字符串常量

String是不可变的字符序列,体现为以下三种情况

  • 当字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值
  • 当对现有字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值
  • 当调用String的replace方法修改指定字符串时,也需要重新指定内存区域赋值,不能使用原有value进行赋值

通过字面量的方式给一个字符串赋值,字符串值声明在了字符串常量池中,字符串常量池中不会存储相同的字符串的

1
String name = "张三";

字符串常量池的底层结构

阅读全文 »

javap命令

1
2
#javap的语法
javap [选项] class文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#javap 的命令选项
-version 版本信息
-v -verbose 输出附加信息,不包括私有信息,可以与-p结合,查看最全的信息
-l 输出行号和局部变量表
-public 仅显示公共类和成员
-protected 显示受保护的/公共类和成员
-package 显示程序包/受保护的/公共类
和成员 (默认)
-p -private 显示所有类和成员
-c 对代码进行反汇编
-s 输出内部类型签名
-sysinfo 显示正在处理的类的系统信息 (路径, 大小, 日期, MD5 散列)
-constants 显示最终常量
-classpath <path> 指定查找用户类文件的位置
-cp <path> 指定查找用户类文件的位置
-bootclasspath <path> 覆盖引导类文件的位置
阅读全文 »