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

news2025/1/12 3:48:52

文章目录

  • switch 实现成绩评级
  • JVM内存模型概念
    • 栈的特点
    • 堆的特点
  • 垃圾回收机制
    • 通用的分代垃圾回收机制
      • 三种清理算法
      • 垃圾回收过程
      • 垃圾回收常见的两种检测引用算法
      • 内存泄露常见原因
  • this的用法
    • 创建对象的四步
  • static 静态
    • 特点
  • 变量的分类和作用域
  • import

switch 实现成绩评级

image.png
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内存模型概念

栈的特点

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

堆的特点

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

垃圾回收机制

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

通用的分代垃圾回收机制

image.png

  • 年轻代——存放刚刚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
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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1471372.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux基础命令—系统服务

基础知识 centos系统的开机流程 1)通电 2)BIOS硬件检查 3)MBR引导记录 mbr的引导程序 加载引导程序 让硬件加载操作系统内核 MBR在第一个磁盘第一个扇区 总大小512字节 mbr: 1.引导程序: 占用446字节用于引导硬件,加载引导程序 2.分区表: 总共占…

Seata分布式事务实战XATCC模式

目录 XA模式 XA 模式的使用 Spring Cloud Alibaba整合Seata XA TCC模式 TCC模式接口改造 TCC如何控制异常 Spring Cloud Alibaba整合Seata TCC XA模式 整体机制 在 Seata 定义的分布式事务框架内&#xff0c;利用事务资源&#xff08;数据库、消息服务等&#xff09;对…

Mysql学习之数据库事务

事务 数据库事务概述 事务是数据库区别于文件系统的重要特性之一&#xff0c;当有了事务就可以让数据库始终保持一致性。同时还可以通过事务的机制&#xff0c;恢复到某个时间点&#xff0c;这样就可以保证以提交到数据库的修改不会因为系统崩溃而丢失 只有Innodb支持事务的 …

camunda7流程平台技术架构概述

Camunda Platform 是一个基于 Java 的BPMN(流程引擎)、DMN&#xff08;规则引擎&#xff09;、CMMN&#xff08;案例管理&#xff09;的开源框架。主要组件是用 Java 编写的&#xff0c;主要专注于为 Java 开发人员提供在 JVM 上设计、实现和运行业务流程和工作流所需的工具&am…

【TCP/IP】内核网络堆栈

在Linux内核中&#xff0c;网络堆栈&#xff08;network stack&#xff09;是一套实现网络通信功能的软件包&#xff0c;负责处理数据包的发送和接收。网络堆栈按照OSI模型&#xff08;开放式系统互联通信参考模型&#xff09;或TCP/IP模型的层次结构来组织&#xff0c;实现了从…

Linux-部署各类软件(黑马学习笔记)

MYSQL MYSQL5.7版本在CentOS系统安装 注意&#xff1a;安装操作需要root权限 MySQL的安装我们可以通过前面学习的yum命令进行。 安装 1.配置yum仓库 # 更新密钥 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022# 安装Mysql yum库 rpm -Uvh http://repo.mysql.…

端口映射的软件有哪些?

端口映射软件是一种实用工具&#xff0c;能够帮助用户在网络中实现远程通信&#xff0c;解决不同地区电脑与电脑、设备与设备、电脑与设备之间的信息传输问题。其中&#xff0c;【天联】组网天联是一款功能强大的端口映射软件&#xff0c;它通过在全国各主要节点部署加速服务器…

介绍 Gradio 与 Hugging Face

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 我们可以使用 Gradio 库为我们的模型构建演示。Gradio 允许您完全使用 Python 为任何机器学习模型构建、自定义和共享基于 Web 的演示。使机器学习模型变得可交互和易于使用。 为什么首先要为您的机器…

贪心算法(算法竞赛、蓝桥杯)--奶牛耍杂技

1、B站视频链接&#xff1a;A24 贪心算法 P1842 [USACO05NOV] 奶牛玩杂技_哔哩哔哩_bilibili 题目链接&#xff1a;[USACO05NOV] 奶牛玩杂技 - 洛谷 #include <bits/stdc.h> using namespace std; const int N50005; struct node{int w,s;bool operator<(node &…

外贸精英催单秘籍:突破观望犹豫,抓住订单黄金时机!

年底将至&#xff0c;对于外贸人来说&#xff0c;这是一个重要的订单冲刺时机。在这个关键时刻&#xff0c;如何向国外客户催单成为一项关键任务。本文将分享催单的技巧&#xff0c;并附带销冠年底工作安排计划。同时&#xff0c;我们将引入Focussend&#xff0c;一款具有邮件自…

Linux软件高级编程-进程基本概念--day6

1.进程&#xff1a; 程序&#xff1a; 存放在外存的一段数据组成的文件 进程&#xff1a; 是一个程序动态执行的过程&#xff0c;包括进程的创建、进程的调度、进程的消亡 2.进程相关命令&#xff1a; 1&#xff09;top&#xff1a; 动态查看当前系统中所有进程信息&#xff08…

Jmeter系列(1)Mac下载安装启动

目录 Jmeter下载安装启动下载启动 Jmeter下载安装启动 注意⚠️&#xff1a;使用jmeter需要有java环境 下载 官网下载地址&#xff1a;https://jmeter.apache.org/ 会看到这里有两个版本&#xff0c;那么有什么区别么&#xff1f; Binaries是可执行版&#xff0c;直接下载解…

Redis哨兵模式和Redis Cluster模式

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容Redis Cluster 模式支持自动故障转移功能吗&#xff1f;Redis Cluster 模式支持自动故障转移功能和哨兵有什么区别&#xff1f;Redis Cluster 模式和哨兵模式&#xff08;Sentinel&#xff09;在自动故障转移方面有一些关键…

Niginx介绍和安装使用

Nginx是什么&#xff1f; Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru站点&#xff08;俄文&#xff1a;Рамблер&#xff09;开发的&#xff0c;第一…

什么是Elasticsearch SQL

什么是Elasticsearch SQL 一. 介绍二. SQL 入门 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 一. 介绍 Elasticsearch SQL 是一个 X-Pack 组件&#xff0c;允许针对 Elasticsea…

linux系统---防火墙拓展

目录 一、iptables 1.基本语法 2.四表五链——重点记忆 2.1四表 2.2五链 2.3总结 3.iptables选项示例 3.1 -Z 清空流量计数 3.2 -P 修改默认规则 3.3 -D 删除规则 3.4 -R 指定编号替换规则 4.白名单 5.通用匹配 6.示例 6.1添加回环网卡 6.2可以访问端口 6.3 主…

matlab|计及源荷不确定性的综合能源生产单元运行调度与容量配置随机优化模型

目录 1 主要内容 1.1 风光场景聚类 1.2 主模型程序结果 1.3 随机模型和确定性模型对比 1.4 有无储气对比 1.5 煤价灵敏性分析 1.6 甲烷价格灵敏性分析 2 部分程序 3 下载链接 1 主要内容 本程序复现《计及源荷不确定性的综合能源生产单元运行调度与容量配置两阶段随机…

Bert基础(四)--解码器(上)

1 理解解码器 假设我们想把英语句子I am good&#xff08;原句&#xff09;翻译成法语句子Je vais bien&#xff08;目标句&#xff09;。首先&#xff0c;将原句I am good送入编码器&#xff0c;使编码器学习原句&#xff0c;并计算特征值。在前文中&#xff0c;我们学习了编…

Spring Boo项目中方法参数对象中字段上存在的自定义注解如何进行拦截解析

一、前言 在Spring Boot项目开发过程中&#xff0c;我们经常会使用到自定义注解的方式进行业务逻辑开发&#xff0c;此时注解我们一般是放在方法或者类上面&#xff0c;通过AOP切面拦截的方式进行自定义业务逻辑填充。但是如果自定义注解放在类的字段上&#xff0c;此时应该如…

Power Apps-组件使用全局变量

组件并不可以直接使用全局变量&#xff0c;若想使用全局变量可以使用如下方法&#xff1a; 首先点击整个组件&#xff0c;在右侧边栏中找到自定义属性&#xff0c;点击添加新的自定义属性 填写相关信息&#xff0c;显示名称和名称填写全局变量名称&#xff0c;说明随意编辑 再…