2-23 switch、JVM内存模型、垃圾回收机制、this、static、变量的分类

文章目录

switch 实现成绩评级

switch的特性每次只能比较一个整数,难道要一个一个处理么?

可以使用求余,反正成绩个位数不影响评级

java 复制代码
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内存模型概念

栈的特点

  1. 每一个线程都会对应一个栈,但是所有线程共享一个堆和方法区
  2. 栈描述的是方法执行的内存模型,每个方法被调用都会创建一个栈帧
  3. 栈属于线程私有,无法实现线程间的共享
  4. 栈由系统自动分配,速度快、内存空间连续

堆的特点

  1. 堆用于存储创建好的对象和数组(数组也是对象)
  2. JVM只有一个堆,被所有线程共享
  3. 堆存储空间不连续,灵活但速度慢
  4. 堆被所有线程所共享,在堆上的区域会被垃圾回收期做进一步划分

垃圾回收机制

  1. 内存管理很大程度上是指中对象的管理
  2. 垃圾回收机制回收的是没有任何变量引用的对象,有引用的对象即使长时间没有调用也不会回收

通用的分代垃圾回收机制

  • 年轻代------存放刚刚new过的对象
  • 年老代------Eden满以后会触发一次Minor GC 清理无用对象,将有用对象复制到年老代,年老代中的存储对象会不停循环,转移区块存储,当循环次数超过15次时会转移到年老代进行存储
  • 永久代------Java8后换了名字,但是他的功能是一直都有的

分代垃圾回收,是基于这样一个事实,不同对象的生命周期不同

Full GC用于清理年老代,年轻代。JVM调优中,很大的工作就是Full GC的调节

Minor GC清理年轻代 ,Major GC清理年老代

程序员无权调用垃圾回收器,即使程序员显示调用,也只是申请,不是一定执行(System.gc()

三种清理算法

  1. Minor GC清理年轻代区域
  2. Major GC清理老年代区域
  3. Full GC清理老年代、年轻代、永久代。成本高,会对系统性能产生影响

垃圾回收过程

发现垃圾 -> 回收垃圾

垃圾回收常见的两种检测引用算法

  • 引用计数法
  • 根搜索法

内存泄露常见原因

  1. 大量拼接字符串时,使用了String而不是StringBuilder
java 复制代码
String str = "";
for(int i=0;i < 10000;i++){
    str += i;//相当于产生了10000个String对象
}
  1. HashMap、Vector、List的使用
  2. IO流对象、数据库连接对象、网络连接对象未关闭
  3. 监听器使用不当

this的用法

创建对象的四步

  1. 分配对象空间,并将对象成员变量初始化

  2. 执行属性值的显式初始化

  3. 执行构造方法

  4. 返回对象的地址给相关的变量

  5. this()调用重载的构造方法(非默认)。但是只能在构造方法 中使用,并且必须位于构造方法的第一句

  6. this 不能用于static方法中

static 静态

静态变量、静态方法生命周期和类相同

特点

  1. 为该类的公用变量,属于类,被该类的所有实例共享,在类载入时被初始化
  2. static成员变量只有一份
  3. 一般用"类名.变量名/方法名"来调用
  4. 在static方法中不可直接访问非static的成员(可能此时类还没有被实例化)

变量的分类和作用域

  • 局部变量------属于方法
  • 成员变量------属于对象
  • 静态变量------属于类

import

  1. Java默认会导入java.lang包下的所有类
  2. java.xxx.*会导入该包下所有的类,会延长编译时间但是不会降低运行速度
  3. 引入同名类时,只能写包名全路径
  4. cn.jiacn.jia.jia只是在逻辑上看起来有关系,其实是两个完全独立的包
  5. 静态导入 import static java.lang.Math.*这样可以直接使用该包的静态属性和静态方法。比如之前使用π需要 Math.PI 但是现在只需 PI
相关推荐
Serene_Dream12 小时前
JVM 并发 GC - 三色标记
jvm·面试
rannn_11112 小时前
【苍穹外卖|Day4】套餐页面开发(新增套餐、分页查询、删除套餐、修改套餐、起售停售)
java·spring boot·后端·学习
qq_124987075312 小时前
基于JavaWeb的大学生房屋租赁系统(源码+论文+部署+安装)
java·数据库·人工智能·spring boot·计算机视觉·毕业设计·计算机毕业设计
短剑重铸之日12 小时前
《设计模式》第十一篇:总结
java·后端·设计模式·总结
若鱼191913 小时前
SpringBoot4.0新特性-Observability让生产环境更易于观测
java·spring
觉醒大王13 小时前
强女思维:着急,是贪欲外显的相。
java·论文阅读·笔记·深度学习·学习·自然语言处理·学习方法
努力学编程呀(๑•ี_เ•ี๑)13 小时前
【在 IntelliJ IDEA 中切换项目 JDK 版本】
java·开发语言·intellij-idea
码农小卡拉13 小时前
深入解析Spring Boot文件加载顺序与加载方式
java·数据库·spring boot
向上的车轮13 小时前
为什么.NET(C#)转 Java 开发时常常在“吐槽”Java:checked exception
java·c#·.net
Dragon Wu13 小时前
Spring Security Oauth2.1 授权码模式实现前后端分离的方案
java·spring boot·后端·spring cloud·springboot·springcloud