一、System.gc()的理解
二、内存溢出与内存泄漏
三、Stop The World
四、垃圾回收的并行与并发
五、安全点与安全区域
六、再谈引用(强引用、软引用、弱引用、虚引用、终结器引用)
测试代码:
public class StrongReferenceTest {
public static void main(String[] args) {
StringBuffer str = new StringBuffer("hello,尚硅谷");
// StringBuffer str1 = str;
str = null;
System.gc();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(str);
}
}
测试代码:
public class SoftReferenceTest {
public static class User{
private int id;
private String name;
public User(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
public static void main(String[] args) {
//创建对象,建立软引用
SoftReference<User> softReference = new SoftReference<>(new User(1, "xzt"));
//从软引用中重新获得强引用对象
System.out.println(softReference.get());
System.gc();
System.out.println("After GC:");
//垃圾回收后获得软引用中的对象
System.out.println(softReference.get());
try {
//让系统认为内存资源很紧张、
byte[] b = new byte[1024 * 1024 * 7];
}catch (Throwable e){
e.printStackTrace();
}finally {
System.out.println(softReference.get());
}
}
}
测试代码:
public class WeakReferenceTest {
public static class User{
private int id;
private String name;
public User(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
public static void main(String[] args) {
WeakReference<User> weakReference = new WeakReference<>(new User(1, "xzt"));
System.out.println(weakReference.get());
System.gc();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(weakReference.get());
}
}
测试代码:
public class PhantomReferenceTest {
public static PhantomReferenceTest obj;//当前类对象的声明
static ReferenceQueue<PhantomReferenceTest> phantomQueue = null;//引用队列
public static class CheckRefQueue{
public void check(){
while (true) {
if(phantomQueue != null){
PhantomReference<PhantomReferenceTest> objt = null;
try {
objt = (PhantomReference<PhantomReferenceTest>) phantomQueue.remove();
} catch (InterruptedException e) {
e.printStackTrace();
}
if(objt != null){
System.out.println(objt);
System.out.println("追踪垃圾回收过程:PhantomReferenceTest实例被GC了");
}
}
}
}
}
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("调用当前类的finalize方法");
obj = this;
}
public static void main(String[] args) {
CheckRefQueue checkRefQueue = new CheckRefQueue();
new Thread(() -> {
checkRefQueue.check();
},"A").start();
phantomQueue = new ReferenceQueue<>();
obj = new PhantomReferenceTest();
//构造PhantomReferenceTest 对象的虚引用,并指定了引用队列
PhantomReference<PhantomReferenceTest> phantomReference = new PhantomReference<>(obj, phantomQueue);
try {
System.out.println(phantomReference.get());
obj = null;
System.gc();
Thread.sleep(1000);
if(obj == null){
System.out.println("obj == null");
}else{
System.out.println("obj可用");
}
System.out.println("第2次gc");
obj = null;
System.gc();
Thread.sleep(1000);
if(obj == null){
System.out.println("obj == null");
}else{
System.out.println("obj可用");
}
}catch (Exception e){
e.printStackTrace();
}
}
}