文章目录
- switch 实现成绩评级
- JVM内存模型概念
- 栈的特点
- 堆的特点
- 垃圾回收机制
- 通用的分代垃圾回收机制
- 三种清理算法
- 垃圾回收过程
- 垃圾回收常见的两种检测引用算法
- 内存泄露常见原因
- this的用法
- 创建对象的四步
- static 静态
- 特点
- 变量的分类和作用域
- import
switch 实现成绩评级
switch的特性每次只能比较一个整数,难道要一个一个处理么?
可以使用求余,反正成绩个位数不影响评级
switch ((int)grade/10){case 10:case 9:System.out.println("优秀");break;case 8:System.out.println("良好");break;case 7:System.out.println("中等");break;case 6:System.out.println("及格");break;default:System.out.println("不及格");
}
JVM内存模型概念
栈的特点
- 每一个线程都会对应一个栈,但是所有线程共享一个堆和方法区
- 栈描述的是方法执行的内存模型,每个方法被调用都会创建一个栈帧
- 栈属于线程私有,无法实现线程间的共享
- 栈由系统自动分配,速度快、内存空间连续
堆的特点
- 堆用于存储创建好的对象和数组(数组也是对象)
- JVM只有一个堆,被所有线程共享
- 堆存储空间不连续,灵活但速度慢
- 堆被所有线程所共享,在堆上的区域会被垃圾回收期做进一步划分
垃圾回收机制
- 内存管理很大程度上是指堆中对象的管理
- 垃圾回收机制回收的是没有任何变量引用的对象,有引用的对象即使长时间没有调用也不会回收
通用的分代垃圾回收机制
- 年轻代——存放刚刚new过的对象
- 年老代——Eden满以后会触发一次Minor GC 清理无用对象,将有用对象复制到年老代,年老代中的存储对象会不停循环,转移区块存储,当循环次数超过15次时会转移到年老代进行存储
- 永久代——Java8后换了名字,但是他的功能是一直都有的
分代垃圾回收,是基于这样一个事实,不同对象的生命周期不同
Full GC用于清理年老代,年轻代。JVM调优中,很大的工作就是Full GC的调节
Minor GC清理年轻代 ,Major GC清理年老代
程序员无权调用垃圾回收器,即使程序员显示调用,也只是申请,不是一定执行(System.gc()
)
三种清理算法
- Minor GC清理年轻代区域
- Major GC清理老年代区域
- Full GC清理老年代、年轻代、永久代。成本高,会对系统性能产生影响
垃圾回收过程
发现垃圾 -> 回收垃圾
垃圾回收常见的两种检测引用算法
- 引用计数法
- 根搜索法
内存泄露常见原因
- 大量拼接字符串时,使用了String而不是StringBuilder
String str = "";
for(int i=0;i < 10000;i++){str += i;//相当于产生了10000个String对象
}
- HashMap、Vector、List的使用
- IO流对象、数据库连接对象、网络连接对象未关闭
- 监听器使用不当
this的用法
创建对象的四步
-
分配对象空间,并将对象成员变量初始化
-
执行属性值的显式初始化
-
执行构造方法
-
返回对象的地址给相关的变量
-
this()
调用重载的构造方法(非默认)。但是只能在构造方法中使用,并且必须位于构造方法的第一句 -
this
不能用于static方法中
static 静态
静态变量、静态方法生命周期和类相同
特点
- 为该类的公用变量,属于类,被该类的所有实例共享,在类载入时被初始化
- static成员变量只有一份
- 一般用“类名.变量名/方法名”来调用
- 在static方法中不可直接访问非static的成员(可能此时类还没有被实例化)
变量的分类和作用域
- 局部变量——属于方法
- 成员变量——属于对象
- 静态变量——属于类
import
- Java默认会导入
java.lang
包下的所有类 java.xxx.*
会导入该包下所有的类,会延长编译时间但是不会降低运行速度- 引入同名类时,只能写包名全路径
cn.jia
和cn.jia.jia
只是在逻辑上看起来有关系,其实是两个完全独立的包- 静态导入
import static java.lang.Math.*
这样可以直接使用该包的静态属性和静态方法。比如之前使用π需要Math.PI
但是现在只需PI