知识点回顾:
知道8种排序算法的名字、时间复杂度、空间复杂度
排序方法 | 时间复杂度 | 空间复杂度 |
冒泡排序 | O(n^2) | O(1) |
选择排序 | O(n^2) | O(1) |
插入排序 | O(n^2) | O(1) |
希尔排序 | O(n logn) | O(1) |
归并排序 | O(n log n) | O(n) |
快速排序 | O(n logn) | O(logn) |
堆排序 | O(n logn) | O(1) |
基数排序 | O(n*k) | O(n+k) |
在数据规模小的情况下,冒泡排序是一种不错的方法
静态语言VS动态类语言
编译型语言VS解释型语言
数据类型敏感VS数据类型不敏感
强类型语言VS弱类型语言
静态类型语言:指的是程序未运行的状态任何一个变量在定义的时候就必须指定数据类型,并且不允许改变
动态类型语言:指的是程序运行的状态
变量的类型是程序运行的时候才知道
一、什么是内存垃圾?
创建一个对象不再使用了,但是他仍然占据内存空间这时把这个不用的对象叫做内存垃圾。
二、什么是垃圾回收?
garbage collection=gc
GC又分为手动和自动
手动GC JDK提供了一个GC函数,调用这个函数[System.gc()],就完成对JVM虚拟机内存进行一次GC
用JDK自带的Jvisualvm工具, 安装visual GS插件
自动GC当JVM虚拟机启动后,后台会自动运行一个GC程序,负责内存的GC操作
三、测试垃圾回收器回收垃圾
同一个对象可能被多个指针同时指向
一个指针可以指向不同的对象,但是同一时刻只能指向一个对象
1. 指针是可以传递的
从栈中传递到堆区
例如: 领养宠物成功后, 将宠物对象的指针传递到宠物数组中进行存储
随机生成怪物对象后, 将怪物对象的指针传递到怪物数组中进行存储
从栈中传递到另一个栈中
例如: 宠物杀死怪物成功后, 调用宠物的killOk方法, 并把怪物的指针传递
到killOk方法中, 这样可以在killOk方法中通过怪物的指针获取到被杀死的怪物对象中的信息
2. 禁止直接操作对象中的属性, 用成员方法封装操作对象属性的过程
对象中的属性被private封装了
所有操作都应该提供成员方法, 用指针去调用成员方法来操作
例如: 当宠物攻击或被攻击, 怪物攻击或被攻击, 都应该提供对应的成员方法进行调用
测试当对象有指针指向的时候,对象不会被垃圾回收器回收
当对象没有指针指向的时候,对象会被垃圾回收器回收,不会立即回收,因为短暂的类加载以后找main函数,入栈,调用sleep函数,然后出栈,test01入栈,声明一个demo4文件,执行到new去堆里造对象。Byte那行代码在new那行执行New demo4在test01栈帧中找构造函数压栈执行,数组里面是有下标的,是索引
当我们使用Jvisualvm工具对代码进行运行后的调试会出现下面的情况
对以上的区域进行解释
方法区;
Jdk1.8之前都叫方法区
1.8之后叫元空间 永久代 字节码文件太多。会溢出
堆区
对象永远在堆区中产生
生存者1区(s0)
生存者2区(s1)
老年区
重对象/大对象一开始就在老年代
堆区(Heap Area) | 新生代 | 栈区(Stack Area) | 方法区(Method Area) 元空间(Meta Space) |
老年代(Old Gen) 对象 | 伊甸园区(Eden) 幸存者1区(s0) 幸存者2区(s1) 对象 | 栈帧 指针=参数 指针=局部变量 指针=返回值 | 指针=静态变量 |
垃圾回收主要管堆区
堆区,栈区,方法区都有指针指向堆区的对象
栈区里面的东西都是私有的
四、Minor GC 和Major/Full GC的区别
小对象出生在伊甸园区,垃圾回收后,如果能存活下来,会被转移到幸存者区,对象的年龄计数器会+1,当对象经历了16次回收后依然能够存活,会进入老年区
很多对象都是朝生夕死