1,静态类型语言:指的是程序未运行的状态
任何一个变量在定义的时候就必须指定其数据类型,并且数据类型不允许改变
2,动态类型语言:动态指的是程序运行的状态
变量的类型是程序运行的时候才知道的
3,什么是内存垃圾:JVM堆内存中,已经确认不再被使用的内存对象
4,什么是垃圾回收: GC (garbage collection)
(1)手动gc, JDK提供了一个gc函数, 调用这个函数, 就完成对JVM虚拟机内存进行一次GC
System.gc()
(2)自动gc, 当JVM虚拟机启动后, 后台会自动运行一个gc程序, 负责内存的gc操作
这个后台的gc程序会定时做gc操作, 或者是当JVM内存不够用的时候, 会立刻触发gc
(3)JDK自带的jvisualvm工具,安装Visual GC插件
(4)同一个对象可以被多个指针同时指向。一个指针可以指向不同的对象, 但是同一时刻只能指向一个对象
(5)测试当对象有指针指向的时候, 对象不会被垃圾回收器回收
当对象没有指针指向的时候, 对象会被垃圾回收器回收, 但是不会被立即回收?
5,方法区Method Area ---> JDK1.8后改名为元空间Meta Space
栈区 Stack Area,堆区 Heap Area, 伊甸园区 Eden,生存者1区, 生存者2区, 老年区
(1)程序运行过程中很多对象都是朝生夕死
(2)小对象出生在伊甸园区, gc后, 如果能存活下来会被转移到幸存者区, 对象的年龄计数器会+1
当对象经历了16次回收后依然能够存活, 会进入老年代。重对象/大对象一出生就在老年代
(3)Minor GC和Major GC/Full GC的区别
1)Minor GC 发生在新生代的GC, 速度很快
2)Major GC/Full GC发生在老年代的GC, 通常Major GC发生的时候都伴随着Minor GC的发生, 速度比较慢。在JVM虚拟机执行GC的时候, 所有的线程都会暂停运行, 有一句叫做"stop the world!"
(4)垃圾回收程序设计
package Chapter06;
public class Demo01 {
//没有static的修饰,data是成员变量,占用1024=1KB 1024*1024=1MB 1024*1024*100=100MB
byte[]data=new byte[1024*1024*100];//在Demo01上执行
static Demo01 demo=null;//1,先发生类加载,只跟这段代码有关。类加载只跟静态变量和类加载代码块有关
public static void main(String[] args) {//2,类加载成功之后,mian函数入栈,然后sleep执行,
// 之后test01入栈执行
sleep(20);
test01();
sleep(10);
System.gc();
while(true){}//在这里进行死循环的目的是为了让mian函数
}
public static void test01(){
Demo01 demo01=new Demo01();//在test01栈帧中执行,Demo01在堆区开辟对象(data)
demo=demo01;
}
public static void sleep(int n){
for (int i=1;i<=n;i++){
System.out.println(i);
try{
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
}
}
System.out.println();
}
}
当计数到20时堆区中old开始产生垃圾



