Map遍历、反射、GC

news2024/10/6 18:48:20

map的遍历

用foreach遍历

        HashMap<Character,Integer> map = new HashMap<>();
        map.put('A',2);
        map.put('B',3);
        map.put('C',3);
        for (Map.Entry<Character,Integer> entry: map.entrySet()) {
            char key = entry.getKey();
            int value = entry.getValue();
            System.out.println(key+" "+value);
        }

反射

Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。

应用场景

1、JDBC中,利用反射动态加载了数据驱动程序,使用Class,forName()通过反射加载数据库的驱动程序
2、Web服务器中利用反射机制调用了Servlet的服务方法
3、Eclispe等开发工具利用反射动态刨析对象的类型和结构
4、Spring框架,Spring通过XML配置模式装载bean的过程

获取反射的三种方式

public class Student{
	private int id;
	String name;
	protected boolean sex;
	public float score;
}
public class Get{
	//获取反射的三种方式
	public staic void main(String[] args) throws ClassNotFoundException{
		//方式一:通过建立对象
		Student stu = new Student();
		Class classobj1 = stu.getClass();
		System.out.println(classobj1.getName());
		//方式二:通过路径实现反射
		Class classobj2 = Class.forName("fanshe.Student");
		System.out.println(classobj2.getName());
		//方式三:通过类名实现反射
		Class classobj3 = Student.class;
		System.out.println(classobj3.getName());
	}
}

GC

在JVM中,有一个低优先级的垃圾回收线程,在正常情况下不会执行,只有在当前堆内存不足或者虚拟机空闲的情况下,才会触发执行,扫描那些没有任何引用的对象,并对他们进行回收。

垃圾回收的时机:

1、显式调用System.gc();
2、由JVM垃圾回收机制决定(a 内存不足,触发GC;b finalize()方法)

垃圾回收策略:

1、引用计数算法:

  • 添加一个引用计数器,调用+1,引用失效-1,为0回收
  • 不能解决对象之间互相引用的问题

2、可达性分析算法(GC Roots)

需要垃圾回收的内存

1、方法区(1.7)/元空间(1.8)
2、堆(GC堆):Java堆可以细分为

  • 新生代(Young Generation):新生代又可分为Eden区和Survivor区

新生代的垃圾回收称为:Minor GC或者Young GC;
新生代的垃圾回收指发生在新生代的垃圾回收,因为新生代对象具有朝生夕灭的特性,所以Minor GC非常频繁,一般回收动作也快

  • 老年代(Old Generation)

老年代垃圾回收称为:Major GC
出现Major GC,一般都会伴随着至少一次的Minor GC
Major GC一般比Minor GC慢十倍以上

垃圾回收算法

1、标记清除算法(Mark-Sweep):老年代算法
2、标记整理算法(Mark-Compact):老年代算法
3、复制算法(copying):新生代算法
4、分代收集(Generation Collection)

垃圾收集过程

在这里插入图片描述

垃圾收集造成的影响

1、STW:用户线程暂停

在垃圾收集器中,并发和并行的概念有所不同
并行:指的是多条垃圾收集线程同时执行,用户线程处于等待状态
并发:指用户线程和垃圾线程同时执行(不一定同时执行,也有可能是交替执行),用户线程继续执行,垃圾收集器在另一个CPU上

2、评判垃圾收集器的指标:吞吐量和用户体验
吞吐量:吞吐量=运行用户代码的时间/(运行用户代码的时间+垃圾收集的时间)
停顿时间/用户体验:GC造成的用户线程单次停顿时间和总的停顿时间
用户体验优先和吞吐量优先是成反比的关系

垃圾回收器

在这里插入图片描述
Serial (复制算法,STW):最早的单线程串行垃圾回收器。
ParNew (复制算法,STW):是 Serial 的多线程版本。
Parallel Scavenge (复制算法):Parallel 和 ParNew收集器类似是多线程的,但 Parallel Scavenge 是吞吐量优先的收集器,可以牺牲等待时间换取系统的吞吐量。
Serial Old (标记-整理法):Serial 垃圾回收器的老年版本,同样也是单线程的,可以作为 CMS 垃圾回收器的备选预案。
Parallel Old (标记整理法):Parallel Old 是 Parallel 老生代版本,Parallel 使用的是复制的内存回收算法,Parallel Old 使用的是标记-整理的内存回收算法。
CMS (标记-整理法):一种以牺牲吞吐量为代价来获得最短回收停顿时间为目标的收集器,非常适用 B/S 系统。
G1 (标记-整理法 + 复制算法):一种兼顾吞吐量和停顿时间的 GC 实现,是 JDK9 以后的默认 GC 选项。

CMS(老年代收集器,结合新生代收集器Serial和ParNew收集器一起使用)

四个步骤:

  • 初始标记: 初始标记标记一下GCRoots可以关联到的对象,STW,整个过程很快
  • 并发标记: 这个阶段紧随初始标记阶段,在“初始标记”的基础上继续向下追溯标记。注意这里是并发标记,表示用户线程可以和 GC 线程一起并发执行,这个阶段不会暂停用户的线程哦。
  • 重新标记: 修正并发标记阶段,因为用户线程也在并发执行,所以导致原本没有被GCRoots关联的对象又被关联起来了,需要重新标记,STW,比初始标记长,比并发标记时间短
  • 并发清除: 并发的清除标记的对象,应用线程和GC清除线程可以一起并发执行

缺陷:

  • 内存碎片
  • 更多的CPU资源
  • 需要更大的对空间

CMS使用“标记-清除”算法进行的垃圾回收
CMS从全局来看,CMS收集器的内存回收是和用户线程一起并发执行的。

G1(全局收集器)

四个阶段:

  • 初始标记: 和CMS不同,不用STW,和MinorGC一起发生(G1触发MinorGC时,同时将老年代的标记给做了)
  • 并发标记: G1和CMS做的事情一样,不过G1多做了一件事情,在并发标记阶段,如果发现哪个Tenured中对象的存活几率很小或者没有对象存活,那么G1在这个阶段就会把他回收掉,不用等后面的筛选回收阶段;同时,在这个阶段,G1还会计算每个region的对象存活率,方便后面筛选回收阶段使用
  • 最终标记: 和CMS重新标记一样
  • 筛选回收: G1没有CMS的并发清除,而是筛选回收,G1挑选出在并发标记阶段计算出的存活率低的region对象进行回收,这个阶段也是和MinorGC一起回收的

G1从整体来看是基于标记-整理 算法实现的回收器,但从局部(两个Region之间)上看又是基于 标记-复制 算法实现的

FULL GC

Full GC是针对整个新生代、老生代、元空间(metaspace,Java8以上版本取代perm gen)的全局范围的 GC。Full GC不等于Major GC,也不等于Minor GC + Major GC,发生Full GC需要看使用了什么垃圾收集器组合,才能解释是什么样的垃圾回收。

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

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

相关文章

Nacos 进阶篇---服务发现:服务之间请求调用链路分析(六)

一、引言 前面几个章节把Nacos服务注册从客户端到服务端&#xff0c;整个流程源码都分析了一遍。 本章节我们来分析&#xff0c;order-service、stock-service 完成Nacos注册后&#xff0c;可以通过Feign的方式&#xff0c;来完成服务之间的调用。那它的底层是如何实现的&am…

linux下的docker使用

docker是什么&#xff0c;docker翻译过来的意思就是码头工人&#xff0c;顾名思义&#xff0c;docker本质上就是一个搬运工&#xff0c;只不过从搬运货物改成了搬运程序&#xff0c;使搬运的不同的程序能够独立的运行在码头上的不同容器内&#xff0c;互不干扰&#xff0c;而他…

不使用ScrollRect 和 HorizontalLayoutGroup做的横向循环列表

一、 版本一 1.前情提要 因为需要展示300多个相同的物体&#xff0c;但是如果全部放在场景内&#xff0c;运行起来会很卡&#xff0c;所以想到了用无限循环&#xff0c;然后动态填充不同的数据。 做的这个没有用HorizontalLayoutGroup 和 ScrollRect 。 1.没有使用Horizontal…

Git原理及常用命令小结——实用版(ing......)、Git设置用户名邮箱

Git基本认识 Git把数据看作是对小型文件系统的一组快照&#xff0c;每次提交更新&#xff0c;或在Git中保存项目状态时&#xff0c;Git主要对当时的全部文件制作一个快照并保存这个快照的索引。同时&#xff0c;为了提高效率&#xff0c;如果文件没有被修改&#xff0c;Git不再…

JSON的序列化与反序列化以及VSCode执行Run Code 报错

JSON JSON: JavaScript Object Notation JS对象简谱 , 是一种轻量级的数据交换格式。 JSON格式 { "name":"金苹果", "info":"种苹果" } 一个对象&#xff1a;由一个大括号表示.括号中通过键值对来描述对象的属性 (可以理解为, 大…

操作系统总结(2)

目录 2.1 进程的概念、组成、特征 &#xff08;1&#xff09;知识总览 &#xff08;2&#xff09;进程的概念 &#xff08;3&#xff09;进程的组成—PCB &#xff08;4&#xff09;进程的组成---程序段和数据段 &#xff08;5&#xff09;程序是如何运行的呢&#xff1f…

Android和flutter交互,maven库的形式导入aar包

记录遇到的问题&#xff0c;在网上找了很多资料&#xff0c;都是太泛泛了&#xff0c;使用后&#xff0c;还不能生效&#xff0c;缺少详细的说明&#xff0c;或者关键代码缺失&#xff0c;我遇到的问题用红色的标注了 导入aar包有两种模式 1.比较繁琐的&#xff0c;手动将aar…

Java8-HashMap实现原理

目录 HashMap原理 hashmap的put流程&#xff1a; HashMap扩容机制&#xff1a; HashMap的寻址算法&#xff1a; HashMap原理 HashMap的底层数据结构是由&#xff0c;数组&#xff0c;链表和红黑树组成的。 当我们往HashMap中put元素的时候&#xff0c;利用key的hashCode重…

HC32F103BCB使用SPI获取AS5040编码器数据

1.AS5040介绍 2.硬件电路 硬件上使用SSI通信方式连接。 3.配置硬件SPI 查看手册&#xff0c;AS5040时序 可以看到在空闲阶段不发生数据传输的时候时钟(CLK)和数据(DO)都保持高电位(tCLKFE阶段)&#xff0c;在第一个脉冲的下降沿触发编码器载入发送数据&#xff0c;然后每一个…

【Unity Shader入门精要 第9章】更复杂的光照(四)

1. 透明度测试物体的阴影 对于物体有片元丢弃的情况&#xff0c;比如透明度测试或者后边会讲到的消融效果&#xff0c;使用默认的 ShadowCaster Pass 会产生问题&#xff0c;这是因为该Pass在生成阴影映射纹理时&#xff0c;没有考虑被丢弃的片元&#xff0c;而是使用完整的模…

FTP文件传输议

FTP是一种文件传输协议&#xff1a;用来上传和下载&#xff0c;实现远程共享文件&#xff0c;和统一管理文件 工作原理&#xff1a;用于互联网上的控制文件的双向传输是一个应用程序。工作在TCP/IP协议簇的&#xff0c;其传输协议是TCP协议提高文件传输的共享性和可靠性&#…

阅读笔记——《AFLNeTrans:状态间关系感知的网络协议模糊测试》

【参考文献】洪玄泉,贾鹏,刘嘉勇.AFLNeTrans&#xff1a;状态间关系感知的网络协议模糊测试[J].信息网络安全,2024,24(01):121-132.【注】本文仅为作者个人学习笔记&#xff0c;如有冒犯&#xff0c;请联系作者删除。 目录 摘要 1、引言 2、背景及动机 2.1、网络协议实现程…

正点原子LWIP学习笔记(二)MAC简介

MAC简介 一、MAC简介&#xff08;了解&#xff09;二级目录三级目录 二、ST的ETH框架&#xff08;了解&#xff09;三、SMI站管理接口&#xff08;熟悉&#xff09;四、介质接口MII、RMII&#xff08;熟悉&#xff09; 一、MAC简介&#xff08;了解&#xff09; STM32 的 MAC …

Ubuntu24.04设置静态IP地址

Ubuntu24.04设置静态IP地址 前言&#xff1a;vm17.5的动态IP问题 第一个是设置的静态IP我们可以看到是forever&#xff0c;第二个则是动态IP则是一天的时间。 如果我们不设置静态IP的话&#xff0c;那么可能在本地测试项目的时候&#xff0c;第二天发现一些服务不能用了&#…

13.js对象

定义 一种复杂数据类型&#xff0c;是无序的&#xff08;不保留键的插入顺序&#xff09;&#xff0c;以键值对&#xff08;{key:value})形式存放的数据集合 对象的创建 &#xff08;1&#xff09;字面量创建 var 对象名{ } &#xff08;2&#xff09;内部构造函数创建 v…

VirtualBox安装ubuntu22.04记录

一,VirtualBox 软件安装 虚拟机&#xff08;Virtual Machine&#xff09;指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。在实体计算机中能够完成的工作在虚拟机中都能够实现。 常见的虚拟机软件主要有两款 VMware 和 VirtualBox 。VMwar…

争议湖北消费金融2023年业绩,营收下滑or财务内控重大缺陷?

近日&#xff0c;湖北消费金融股份有限公司&#xff08;下称“湖北消费金融”&#xff09;披露了2023年度相关信息&#xff0c;包括股权结构、关联方、董事会、分支机构、资产负债情况等信息。 据介绍&#xff0c;湖北消费金融的注册资本为10.058亿元&#xff0c;法定代表人为…

linux---线程控制

线程和进程 以前我们要同时跑多个程序&#xff0c;可以通过fork()多个子进程&#xff0c;然后通过系统函数进行程序的替换&#xff0c;但是创建进程代价大&#xff0c;不仅要拷贝一份父进程的地址空间&#xff0c;页表&#xff0c;文件表述符表等。但是线程不需要因为是进程的…

使用JavaScript日历小部件和DHTMLX Gantt的应用场景(三)

DHTMLX Suite UI 组件库允许您更快地构建跨平台、跨浏览器 Web 和移动应用程序。它包括一组丰富的即用式 HTML5 组件&#xff0c;这些组件可以轻松组合到单个应用程序界面中。 DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表&#xff0c;可满足项目管理应用…

【调试笔记-20240520-Linux-在 WSL2 / Ubuntu 20.04 中编译 QEMU 可运行的 OVMF 固件】

调试笔记-系列文章目录 调试笔记-20240520-Linux-在 WSL2 / Ubuntu 20.04 中编译 QEMU 可运行的 OVMF 固件 文章目录 调试笔记-系列文章目录调试笔记-20240520-Linux-在 WSL2 / Ubuntu 20.04 中编译 QEMU 可运行的 OVMF 固件 前言一、调试环境操作系统&#xff1a;Windows 10 …