Map遍历、反射、GC

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.mzph.cn/news/840115.shtml

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

相关文章

影视解说5.0版零基础视频课程

课程简介 现在还能做解说吗、不会写解说文案怎么解决、不会配音怎么解决、如何找到合适的素材资源、如何变现…这是很多想做解说的伙伴最关心的几大问题。比如文案&#xff0c;我们推荐一个网站&#xff0c;10分钟搞定一篇文案&#xff0c;配音可以真人配音也可以软件配音。5.…

【区块链】fisco网络运维之添加节点黑名单

基于已完成的区块链系统与管理平台搭建工作&#xff0c;开展区块链节点的黑名单工作&#xff0c;具体操作如下 以node3为例子 1查看node0节点的连接状态日志&#xff08;现有4个节点连接&#xff09; 注意&#xff1a;如果查询不到连接状态&#xff0c;修改node0的配置文件中…

Flask多线程开发指南

文章目录 1. 什么是多线程&#xff1f;2. Flask中的多线程3. 注意事项结论 在Web应用程序开发中&#xff0c;有时候需要处理一些耗时的任务&#xff0c;例如与数据库交互、发送网络请求或执行计算密集型的操作。为了保持用户体验的流畅性&#xff0c;我们可以使用多线程来处理这…

LoadBalancer

一、手写随机负载均衡 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency><!--引入nacos discovery--> <dependency><groupId>com…

socket地址理解

socket介绍 套接字的基本概念 1. 套接字的定义&#xff1a; 套接字&#xff08;socket&#xff09;是计算机网络中用于通信的端点&#xff0c;它抽象了不同主机上应用进程之间双向通信的机制。 2. 套接字的作用&#xff1a; 套接字连接应用进程与网络协议栈&#xff0c;使…

vb.net打开CAD指指定路径文件

首先打开vsto,创建窗体&#xff0c;添加一个按钮&#xff0c;双击按钮录入代码&#xff1a; Public Class Form1Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.ClickDim cad As Objectcad CreateObject("autocad.Application")cad…

Java枚举的本质

目录 1.枚举简介 1.1.规范 1.2.枚举类真实的样子 1.3.枚举类的特点 1.4.枚举可以使用的方法 1.4.1.toString()方法 1.4.2.valueOf方法 1.4.3.values方法 1.4.4.ordinal方法 1.5.枚举的用法 1.5.1.常量 1.5.2.switch 1.5.3.枚举中增加方法 1.5.4.覆盖枚举方法 1.5…

工具推荐:市面上有哪些带有ai问答机器人的SaaS软件

众所周知&#xff0c;SaaS&#xff08;软件即服务&#xff09;模式下的AI问答机器人已经逐渐成为企业、个人在办公、生活和学习中的辅助工具。ai问答机器人凭借高效、便捷、智能的特点&#xff0c;为用户提供了全新的交互体验。本文将推荐几款市面上好用的带有ai问答机器人的Sa…

【文心智能体】创建一个属于自己的生活情感类智能体

文章目录 前言一、创建智能体二、体验 前言 智能体技术的快速发展&#xff0c;进一步激发了各行业开发者对其实际应用及用户需求的深入探索。 创建一个属于自己的智能体。文心一言提供了一个很好的平台。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考…

GpuMall智算云:Ubuntu 实例桌面版

基于 ubuntu18.04 安装的桌面版本&#xff0c;桌面使用 xfce4 &#xff0c;集成了 Pytorch2.3.0、cuda11.8、Python3.10、VNC、noVNC、VSCode-Server。 在 镜像市场 选择xfce4-desktop镜像&#xff0c;然后进行创建实例 GpuMall智算云 | 省钱、好用、弹性。租GPU就上GpuMall…

一维前缀和[模版]

题目链接 题目: 分析: 因为要求数组中连续区间的和, 可以使用前缀和算法注意:下标是从1开始算起的, 真正下标0的位置是0第一步: 预处理出来一个前缀和数组dp dp[i] 表示: 表示[1,i] 区间所有元素的和dp[i] dp[i-1] arr[i]例如示例一中: dp数组为{1,3,7}第二步: 使用前缀数…

RabbitMQ - SimpleMessageListenerContainer的实现逻辑

RabbitMQ - SimpleMessageListenerContainer的实现逻辑 Queue&#xff08;队列&#xff09;&#xff1a;在 RabbitMQ 中用于存储消息的数据结构。生产者将消息发送到队列中&#xff0c;而消费者从队列中接收消息。 Connection&#xff08;连接&#xff09;&#xff1a;连接是应…

Python代码实现代价函数

最小二乘法 最小二乘法是一种在统计学、数学、工程学和计算机科学等领域广泛使用的优化方法。 基本原理 最小二乘法的主要目的是找到一组模型参数&#xff0c;使得根据这些参数所预测的数据与实际观测数据之间的差异&#xff08;即残差&#xff09;的平方和最小。 数学表达…

5.22R语言初步学习-1

今天上课讲R语言&#xff0c;要干什么没讲&#xff0c;分析什么&#xff0c;目的是什么没讲。助教基本上就是让我们打开窗口&#xff0c;按要求抄代码指令&#xff0c;代码原理也没讲......再加上最近正好在学概率论与数理统计&#xff0c;肯定是有用的&#xff0c;所以还是学习…

PHP质量工具系列之php_CodeSniffer

PHP_CodeSniffer 是一组两个 PHP 脚本&#xff1a;主脚本 phpcs 对 PHP、JavaScript 和 CSS 文件进行标记&#xff0c;以检测是否违反定义的编码标准&#xff1b;第二个脚本 phpcbf 自动纠正违反编码标准的行为。PHP_CodeSniffer 是一个重要的开发工具&#xff0c;可以确保你的…

【简单介绍下近邻算法】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

Python-3.12.0文档解读-内置函数hash()详细说明+记忆策略+常用场景+巧妙用法+综合技巧

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 详细说明 功能描述 参数 返回值 特性 使用示例 注意事项 记忆策略 常用场景 …

Predictable MDP Abstraction for Unsupervised Model-Based RL

ICML 2023 paper code Intro 文章提出了一种用于无监督基于模型强化学的方法&#xff0c;称为可预测MDP抽象&#xff08;Predictable MDP Abstraction, PMA&#xff09;。在MBRL中&#xff0c;一个关键部分是能够准确建模环境动力学动态模型。然而&#xff0c;这个预测模型误…

【SQL国际标准】ISO/IEC 9075:2023 系列SQL的国际标准详情

目录 &#x1f30a;1. 前言 &#x1f30a;2. ISO/IEC 9075:2023 系列SQL的国际标准详情 &#x1f30a;1. 前言 ISO&#xff08;国际标准化组织&#xff0c;International Organization for Standardization&#xff09;是一个独立的、非政府间的国际组织&#xff0c;其宗旨是…

IPKISS ------ AMF 添加自定义层

IPKISS ------ AMF 添加自定义层 正文 正文 很多时候&#xff0c;我们想要添加属于我们自己的层&#xff0c;此时我们需要向 AMF pdk 中的 gdsii.py 和 layers.py 文件添加层的信息。这两个文件的目录如下&#xff1a; 在 gdsii.py 文件下的 TECH.GDSII.LAYERTABLE 字典中我们…