目录
一、介绍JVM
即java虚拟机(Java Virtual Machine)是一种抽象化的计算机,java可以跨平台运行最主要的原因就是因为有java虚拟机
二、内存分区
有栈、堆、方法区、PC寄存器
堆 | new的对象就会放在堆中 |
方法区 | 加载好的类放在方法区,静态成员 |
栈 | 局部变量 |
PC寄存器 | 存储的是线程地址,描述的是当前线程接下来 要执行的指令在什么地方 |
局部变量和对象引用在栈上(形参是局部变量)
成员变量和对象在堆上
静态变量在方法区中
(基本数据类型中对应的内存空间储存的是具体的值,引用类型在内存中存的是地址)
三、垃圾回收机制(GC)
1、GC介绍
GC是垃圾回收机制,java中申请的内存可以被垃圾回收装置进行回收,GC可以一定程度的避免内存泄漏,但是会引入一些额外的开销。
垃圾回收机制的基本思路就是
- 标记:找到这个对象是否需要回收,并且标记出来
- 回收:将这个标记为需要回收的对象回收回去
2、垃圾介绍
在 JVM 进行垃圾回收之前,首先就是判断哪些对象是垃圾,也就是说,要判断哪些对象是可以被销毁的,其占有的空间是可以被回收的。
3、垃圾判断算法(标记)
(1)引用计数法
在这种算法中,假设堆中每个对象(不是引用)都有一个引用计数器。当一个对象被创建并且初始化赋值后,该对象的计数器的值就设置为 1,每当有一个地方引用它时,计数器的值就加 1,例如将对象 b 赋值给对象 a,那么 b 被引用,则将 b 引用对象的计数器累加 1。
反之,当引用失效时,例如一个对象的某个引用超过了生命周期(出作用域后)或者被设置为一个新值时,则之前被引用的对象的计数器的值就减 1。而那些引用计数为 0 的对象,就可以称之为垃圾,可以被收集。
特别地,当一个对象被当做垃圾收集时,它引用的任何对象的计数器的值都减 1。
优点:引用计数法实现起来比较简单,对程序不被长时间打断的实时环境比较有利。
缺点:需要额外的空间来存储计数器,难以检测出对象之间的循环引用。
(2)可达性分析法
如果一个对象会被至少一个在程序中的变量通过直接或间接的方式被其他可达的对象引用,则称该对象就是可达的。更准确的说,一个对象只有满足下述两个条件之一,就会被判断为可达的:
- 对象是属于根集中的对象
- 对象被一个可达的对象引用