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
相关推荐
天天打码14 分钟前
ThinkPHP项目如何关闭runtime下Log日志文件记录
android·java·javascript
魔道不误砍柴功21 分钟前
Java 中反射的高级用法:窥探 Java 世界的魔法之门
java·开发语言·python
P7进阶路32 分钟前
实现用户登录系统的前后端开发
java
2401_8576176233 分钟前
“无缝购物体验”:跨平台网上购物商城的设计与实现
java·开发语言·前端·安全·架构·php
事业运财运爆棚35 分钟前
7种server的服务器处理结构模型
java·linux·服务器
西岭千秋雪_1 小时前
设计模式の中介者&发布订阅&备忘录模式
java·观察者模式·设计模式·中介者模式·备忘录模式
憶巷1 小时前
MyBatis中动态SQL执行原理
java·sql·mybatis
重生之绝世牛码1 小时前
Java设计模式 —— 【结构型模式】享元模式(Flyweight Pattern) 详解
java·大数据·开发语言·设计模式·享元模式·设计原则
seasugar1 小时前
记一次Maven拉不了包的问题
java·maven
Allen Bright1 小时前
【Java基础-26.1】Java中的方法重载与方法重写:区别与使用场景
java·开发语言