当前位置: 首页 > news >正文

内存泄漏详解

文章目录

    • 什么是内存泄漏
    • 内存泄漏的原因
    • 排查及解决内存泄漏
    • 避免内存泄漏
      • 及时释放资源
      • 设置合理的变量作用域
      • 及时清理不需要的对象
      • 避免无限增长
      • 避免内部类持有外部类引用
      • 使用弱引用

什么是内存泄漏

内存泄漏是指不使用的对象持续占有内存使得内存得不到释放,从而造成内存空间的浪费。严格来说,只有对象不会再被程序用到了,但是GC又不能回收他们的情况,才叫内存泄漏。但实际情况很多时候一些不太好的实践会导致对象的生命周期变得很长,甚至导致00M,也可以叫做宽泛意义上的“内存泄漏”。

举个例子,创建的连接不再使用时,需要调用close方法关闭连接,只有连接被关闭后,GC才会回收对应的对象。忘记关闭这些资源会导致持续占有内存,无法被GC回收。这样就会导致内存泄露,最终导致内存溢出。

public class MemoryLeak {public static void main(String[] args) {try{Connection conn =null;Class.forName("com.mysql.jdbc.Driver");conn =DriverManager.getConnection("url","","");Statement stmt =conn.createStatement();ResultSet rs =stmt.executeQuery("....");} catch(Exception e){//异常日志} finally {// 1.关闭结果集 Statement// 2.关闭声明的对象 ResultSet// 3.关闭连接 Connection}}
}

内存泄漏最明显的问题是频繁GC,从而STW次数增加,导致用户体验变差。如果内存泄露问题严重,会导致OOM,直接导致程序不能正常运行。尽管内存泄漏并不会立刻引起程序崩溃,但是一旦发生内存泄漏,程序中的可用内存就会被逐步蚕食,直至耗尽所有内存,最终出现OutOfMemory异常,导致程序崩溃。

内存泄漏的原因

Java使用可达性分析算法来标记垃圾对象。在这个过程中,算法会标记那些仍然可以从根对象(如栈、静态变量等)直接访问到的对象为“可达”,而那些无法从根对象访问到的对象则标记为“不可达”。不可达的对象是候选垃圾,可以被回收。有时候即使某些对象不再使用,它们的引用链可能仍然存在,导致这些对象没有被标记为不可达,从而造成内存泄漏。在这种情况下,虽然这些对象已经不再被实际使用,但由于引用链未断开,它们仍然占用内存。

大多数内存泄露的原因是,长生命周期的对象引用了短生命周期的对象。例如,A对象引用B对象,A对象的生命周期(t1-t4)比B对象的生命周期(t2-t3)长的多。当B对象没有被应用程序使用之后,A对象仍然在引用着B对象。这样,垃圾回收器就没办法将B对象从内存中移除,从而导致内存泄露问题。

所以减少长生命周期对象持有短生命周期对象的强引用是解决内存泄漏的一个关键点。利用弱引用或者软引用可以让垃圾回收器更容易回收不再需要的对象。对于外部资源,如数据库连接、文件、网络连接,用完后应该及时关闭。try-with-resources语句是管理这些资源的有效工具,同时移除不再需要的事件监听器也能防止内存泄漏。管理集合时,设定大小限制并定期清理过期数据可以避免无限增长。使用有界数据结构能帮助控制缓存的大小。静态集合要特别留意,避免它们占用过多内存,通过定期清理来管理数据的存储。通过这些措施,可以减少内存泄漏的风险。

排查及解决内存泄漏

根据运维之前收集到的内存数据、GC日志尝试判断哪里出现了问题。结果发现老年代的内存使用就算是发生GC也一直居高不下,而且随着时间推移也越来越高。

在这里插入图片描述

使用jstat -gc <vmid> 查看GC垃圾回收统计信息,看Full GC后堆空间使用内存还持续增长,且有增长到Xmx设定值的趋势,基本可以肯定存在内存泄露。如果当前完全垃圾回收后内存增长到一个值之后,又能回落,总体上处于一个动态平衡,那么内存泄漏基本可以排除;也可以隔断时间抽取老年代占用内存情况,如果老年代占用情况持续上升也很有可能存在内存泄露的情况。

内存泄漏的主要表象就是内存不足,所以首先要看一下JVM启动参数中内存空间分配是否过小,如果是这种问题调整该参数即可。如果不是参数调的太小,那么应该确定是否新部署或有新变更。首先需要确认是否在最近进行了新的部署或有其他相关的变更,例如代码更新、配置修改等。这些变更可能导致应用出现性能问题,特别是在高负载情况下。

遇到内存泄漏问题,最经典的就是用MAT工具分析dump文件然后找到具体的代码。但如果dump文件巨大就不建议这样,可以使用其他方案,例如,重启、本地复现、jmap -histo:live <pid>在线进行分析等其他方案解决。使用MAT定位内存泄漏思路:

  1. 打开MAT中histogram,找到堆内存中占用最大的对象,内存泄漏很有可能就是由大对象导致的;

    在这里插入图片描述

  2. 由大对象找被哪些线程引用,查看内存占用最大的线程;

    在这里插入图片描述

    在这里插入图片描述

  3. 从线程中的堆栈信息找到项目中自定义的包和对象,从而可定位到具体的代码;

    在这里插入图片描述

    在这里插入图片描述

避免内存泄漏

内存泄漏是由代码中的问题导致的,这些问题通常源于编程错误、设计不良或对资源管理的忽视。那想要避免内存泄漏,就需要从代码层面入手。

及时释放资源

如数据库连接、网络连接和IO连接等,当不再使用时,需要调用close方法来释放连接。只有连接被关闭后,垃圾回收器才会回收对应的对象。否则如果在连接过程中,对一些对象不显性地关闭,将会造成大量的对象无法被回收,从而引起内存泄漏。

在这个例子中,数据库连接conn在方法结束时没有被关闭。这导致了连接资源的泄漏,因为即使在出现异常时也没有释放连接,可能会导致数据库连接池资源被耗尽,影响系统的正常运行。

public class ResourceLeakExample {public void process() {Connection conn = null;try {conn = DriverManager.getConnection(url, user, password);// 使用连接} catch (SQLException e) {e.printStackTrace();}// 连接没有关闭,导致资源泄漏}
}

这里使用了try-with-resources语句来解决这个问题,这种方式可以自动管理资源的释放。连接conn会在try块结束时被自动关闭,即使发生了异常也不会有资源泄漏的问题。

public class ResourceLeakFixedExample {public void process() {try (Connection conn = DriverManager.getConnection(url, user, password)) {// 使用连接} catch (SQLException e) {e.printStackTrace();}// 连接自动关闭}
}

设置合理的变量作用域

一个变量的定义的作用范围大于其使用范围,很有可能会造成内存泄漏。静态变量cache持有所有添加对象的引用。由于这个集合是静态的,它会持续存在,导致对象不会被垃圾回收,可能导致内存使用逐渐增大,最终可能耗尽内存。

public class StaticCacheExample {private static List<Object> cache = new ArrayList<>();public static void addToCache(Object obj) {cache.add(obj); // 对象添加到静态列表}
}

可以将其作用域缩小,解决这个问题。在这个例子中,localCache是一个局部变量,存在于方法的作用域内。当方法执行完毕后,localCache变量会被垃圾回收器回收。通过调用clear方法清空缓存,可以进一步减少内存占用。

public class LocalCacheExample {public void process() {List<Object> localCache = new ArrayList<>();localCache.add(new Object());// 使用 localCachelocalCache.clear(); // 清理缓存}
}

及时清理不需要的对象

这个示例中,cache列表不断添加新对象,但没有进行清理。这样的话,随着时间的推移,cache列表的大小会不断增加,占用大量内存,可能导致系统性能问题。

public class MemoryLeakExample {private List<Object> cache = new ArrayList<>();public void process() {cache.add(new Object()); // 添加对象到缓存// 缓存不清理}
}

修改后的代码中process方法会定期检查cache大小。如果cache超过了设定的大小,就会调用clear方法来清空缓存。这可以帮助控制内存使用,避免列表无限增长。

public class MemoryLeakFixedExample {private List<Object> cache = new ArrayList<>();public void process() {cache.add(new Object());if (cache.size() > 100) {cache.clear(); // 定期清理缓存}}
}

避免无限增长

如果一个集合或缓存没有限制其大小且没有清理机制,它可能无限增加,导致不再需要的对象无法被垃圾回收,从而引发内存泄漏。这个示例中,data列表不断增加对象,没有进行任何限制或清理。这会导致data列表无限增长,逐渐消耗大量内存,最终可能导致内存不足。

public class InfiniteGrowthExample {private List<Object> data = new ArrayList<>();public void addData(Object obj) {data.add(obj); // 不断添加对象// 无限制增长}
}

这里使用LinkedList作为数据结构,并设置了最大大小限制。当列表的大小超过限制时,最旧的元素会被移除。这种做法可以控制内存的使用,避免数据结构无限增长。

public class BoundedGrowthExample {private List<Object> data = new LinkedList<>();public void addData(Object obj) {if (data.size() > 100) {data.remove(0); // 保持列表大小限制}data.add(obj);}
}

避免内部类持有外部类引用

匿名内部类Runnable持有对外部类实例的隐式引用。如果外部类的生命周期很长,可能导致外部类无法被垃圾回收,从而引发内存泄漏。

public class AnonymousInnerClassExample {public void process() {Runnable r = new Runnable() {public void run() {// 使用外部类的实例}};new Thread(r).start();}
}

在改进后的代码中,使用了lambda表达式,避免了匿名内部类带来的隐式引用。这样可以减少对外部类实例的持有,降低内存泄漏的风险。

public class AnonymousInnerClassFixedExample {public void process() {Runnable r = () -> {// 使用外部类的实例};new Thread(r).start();}
}

使用弱引用

弱引用是Java中的一种引用类型,用于在对象不再被强引用时允许垃圾回收器回收这些对象,它主要用于实现缓存和其他需要动态释放内存的场景。与强引用不同,弱引用在垃圾回收时不会阻止对象的回收。如果一个对象只有弱引用指向它,那么在垃圾回收时,这个对象会被回收。弱引用的设计目的是帮助避免内存泄漏。

public class WeakReferenceCache {private Map<String, WeakReference<Object>> cache = new HashMap<>();public void addToCache(String key, Object value) {cache.put(key, new WeakReference<>(value));}public Object getFromCache(String key) {WeakReference<Object> ref = cache.get(key);return (ref != null) ? ref.get() : null;}
}

尽管弱引用设计的目的是避免内存泄漏,但在以下情况下仍然可能出现问题:

  • 缓存失控:如果使用弱引用实现缓存,并且缓存管理策略不当,可能会导致频繁的对象创建和回收,影响性能。
    例如,缓存的对象如果不断被创建和清除,可能导致大量的对象创建压力,从而影响性能。
  • 内存使用不均:弱引用对象的回收是非确定性的。垃圾回收器的回收行为可能不一致,这可能导致应用程序的内存使用行为不如预期。

在这个示例中,clearCache方法会清空缓存。在大多数情况下,缓存中的对象会在下一次垃圾回收时被回收,但如果缓存使用不当,频繁的缓存清空操作可能会影响系统性能。

public class CacheWithPotentialIssues {private Map<String, WeakReference<Object>> cache = new HashMap<>();public void addToCache(String key, Object value) {cache.put(key, new WeakReference<>(value));}public Object getFromCache(String key) {WeakReference<Object> ref = cache.get(key);return (ref != null) ? ref.get() : null;}// 可能引起问题的代码public void clearCache() {cache.clear(); // 清空缓存}
}

相关文章:

内存泄漏详解

文章目录 什么是内存泄漏内存泄漏的原因排查及解决内存泄漏避免内存泄漏及时释放资源设置合理的变量作用域及时清理不需要的对象避免无限增长避免内部类持有外部类引用使用弱引用 什么是内存泄漏 内存泄漏是指不使用的对象持续占有内存使得内存得不到释放&#xff0c;从而造成…...

多角度解析高防CDN防御DDOS及CC攻击

网络攻击的形式也日益多样化&#xff0c;其中DDoS&#xff08;分布式拒绝服务&#xff09;和CC&#xff08;Challenge Collapsar&#xff09;攻击尤为突出&#xff0c;给网站和企业带来了巨大的安全威胁。高防CDN&#xff08;Content Delivery Network&#xff09;作为一种专业…...

(7) cmake 编译C++程序(二)

文章目录 概要整体代码结构整体代码小结 概要 在ubuntu下&#xff0c;通过cmake编译一个稍微复杂的管理程序 整体代码结构 整体代码 boss.cpp #include "boss.h"Boss::Boss(int id, string name, int dId) {this->Id id;this->Name name;this->DeptId …...

C语言系统调用linux文件系统

在C语言中&#xff0c;open、write和read函数是系统调用&#xff08;system calls&#xff09;&#xff0c;它们直接由操作系统提供&#xff0c;用于底层的文件操作。这些函数是UNIX和类UNIX系统&#xff08;如Linux&#xff09;中的标准接口&#xff0c;不同于C标准库中的文件…...

LeetCode142 环形链表 II

前言 题目&#xff1a; 142. 环形链表 II 文档&#xff1a; 代码随想录——环形链表 II 编程语言&#xff1a; C 解题状态&#xff1a; 思路错误&#xff0c;链表不允许被修改 思路 两步走&#xff0c;第一步&#xff0c;判断有没有环&#xff0c;第二步&#xff0c;判断入环口…...

逆向案例二十八——某高考志愿网异步请求头参数加密,以及webpack

网址&#xff1a;aHR0cDovL3d3dy54aW5nYW9rYW90Yi5jb20vY29sbGVnZXMvc2VhcmNo 抓包分析&#xff0c;发现请求头有参数u-sign是加密的&#xff0c;载荷没有进行加密&#xff0c;直接跟栈分析。 进入第二个栈&#xff0c;打上断点&#xff0c;分析有没有加密位置。 可以看到参数…...

WebKit的文本装饰艺术:CSS Text Decoration全解析

WebKit的文本装饰艺术&#xff1a;CSS Text Decoration全解析 CSS文本装饰&#xff08;Text Decoration&#xff09;是一组用于美化和增强网页文本表现的属性&#xff0c;它们可以为文本添加下划线、上划线、线删除和强调标记等效果。WebKit作为许多现代浏览器的渲染引擎&…...

【linux】Shell脚本三剑客之sed命令的详细用法攻略

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…...

解析class字节码文件获取魔数和版本号

写在前面 本文看下如何获取class字节码文件的魔数和版本号信息。 1&#xff1a;正文 需要对class字节码的结构有一定的了解&#xff0c;可以参考这篇文章 。 直接看代码&#xff1a; package org.example;import java.math.BigInteger;public class TTTT {//取部分字节码&…...

技术文档总结----思维导图

性能调优| ProcessOn免费在线作图,在线流程图,在线思维导图 mysql| ProcessOn免费在线作图,在线流程图,在线思维导图 kafka| ProcessOn免费在线作图,在线流程图,在线思维导图 mybatis缓存| ProcessOn免费在线作图,在线流程图,在线思维导图 java锁| ProcessOn免费在线作图,在…...

【iOS】—— retain\release实现原理和属性关键字

【iOS】—— retain\release实现原理和属性关键字 1. retain\reelase实现原理1.1 retain实现原理1.2 release实现原理 2. 属性关键字2.1 属性关键字的分类2.2 内存管理关键字2.2.1 weak2.2.2 assgin2.3.3 strong和copy 2.4 线程安全的关键字2.5 修饰变量的关键字2.5.1常量const…...

这一文,关于Java泛型的点点滴滴 一

作为一个 Java 程序员&#xff0c;用到泛型最多的&#xff0c;我估计应该就是这一行代码&#xff1a; List<String> list new ArrayList<>();这也是所有 Java 程序员的泛型之路开始的地方啊。 不过本文讲泛型&#xff0c;先不从这里开始讲&#xff0c;而是再往前…...

微信小程序之调查问卷

一、设计思路 1、界面 调查问卷又称调查表&#xff0c;是以问题的形式系统地记载调查内容的一种形式。微信小程序制作的调查问卷&#xff0c;可以在短时间内快速收集反馈信息。具体效果如下所示&#xff1a; 2、思路 此调查问卷采用服务器客户端的方式进行设计&#xff0c;服…...

基于Qt的视频剪辑

在Qt中进行视频剪辑可以通过多种方式实现&#xff0c;但通常需要使用一些额外的库来处理视频数据。以下是一些常见的方法和步骤&#xff1a; 使用FFmpeg FFmpeg是一个非常强大的多媒体框架&#xff0c;可以用来处理视频和音频数据。你可以使用FFmpeg的命令行工具或者其库来实现…...

electron 网页TodoList工具打包成win桌面应用exe

参考&#xff1a; electron安装&#xff08;支持win、mac、linux桌面应用&#xff09; https://blog.csdn.net/weixin_42357472/article/details/140643624 TodoList工具 https://blog.csdn.net/weixin_42357472/article/details/140618446 electron打包过程&#xff1a; 要将…...

数据结构之判断二叉树是否为搜索树(C/C++实现)

文章目录 判断二叉树是否为搜索树方法一&#xff1a;递归法方法二&#xff1a;中序遍历法总结 二叉树是一种非常常见的数据结构&#xff0c;它在计算机科学中有着广泛的应用。二叉搜索树&#xff08;Binary Search Tree&#xff0c;简称BST&#xff09;是二叉树的一种特殊形式&…...

golang长连接的误用

误用一&#xff1a;忘记读取响应的body 由于忘记读取响应的body导致创建大量处于TIME_WAIT状态的连接&#xff08;同时产生大量处于transport.go的readLoop和writeLoop的协程&#xff09; 在linux下运行下面的代码: package mainimport ("fmt""html"&qu…...

Springboot @Validate @Valid 基于复杂嵌套对象的参数校验示例

Springboot Validate Valid 基于复杂嵌套对象的参数校验示例 复杂对象 Data public class Object1 {Length(max 50,message "长度不能超过50位字符")NotBlank(message "名称不能为空")private String name;NotNull(message "不能为空")pri…...

算力共享下的,分级路由转发报文协议与通告

目录 网络双 SLA 约束 一、双SLA约束的定义与背景 二、双SLA约束的应用场景 三、双SLA约束的管理与实施 四、双SLA约束的优势与挑战 算力共享下的,分级路由转发报文协议与通告 基础设施即服务(IaaS)类 型算力资源 函数即服务(FaaS)类型算力服务 软件即服务(SaaS…...

滚动数组详解

滚动数组详解 何为滚动数组&#xff1f;滚动数组是如何优化空间的&#xff1f;交替滚动例题&#xff1a;来自某某轮廓线DP的题目 自我滚动(~~不如交替~~ 完结&#xff01;&#xff01;&#xff01; ( 宇宙免责任书&#xff1a;我用的是C) 何为滚动数组&#xff1f; 什么是滚动…...

C 语言动态链表

线性结构->顺序存储->动态链表 一、理论部分 从起源中理解事物&#xff0c;就是从本质上理解事物。 -杜勒鲁奇 动态链表是通过结点&#xff08;Node&#xff09;的集合来非连续地存储数据&#xff0c;结点之间通过指针相互连接。 动态链表本身就是一种动态分配内存的…...

【Leetcode】二十、记忆化搜索:零钱兑换

文章目录 1、记忆化搜索2、leetcode509&#xff1a;斐波那契数列3、leetcode322&#xff1a;零钱兑换 1、记忆化搜索 也叫备忘录&#xff0c;即把已经计算过的结果存下来&#xff0c;下次再遇到&#xff0c;就直接取&#xff0c;不用重新计算。目的是以减少重复计算。 以前面提…...

json数据格式 继续学习

1.定义 轻量级的数据交互格式&#xff0c;可以按照json数据格式去组织和封装数据。 本质是一个带有特定格式的字符串。 2.功能 负责不同编程语言中的数据传递和交互。 3.json数据格式转化 """ 演示json数据和python字典之间的转换 """ impor…...

gradle 构建项目添加版本信息

gradle 构建项目添加版本信息&#xff0c;打包使用 spring boot 的打包插件 build.gradle 配置文件 bootJar {manifest {attributes(Project-Name: project.name,Project-Version: project.version,"project-Vendor": "XXX Corp","Built-By": &…...

vue3 学习笔记17 -- 基于el-menu封装菜单

vue3 学习笔记17 – 基于el-menu封装菜单 前提条件&#xff1a;组件创建完成 配置路由 // src/router/index.ts import { createRouter, createWebHashHistory } from vue-router import type { RouteRecordRaw } from vue-router export const Layout () > import(/lay…...

使用 Redis 实现验证码、token 的存储,用自定义拦截器完成用户认证、并使用双重拦截器解决 token 刷新的问题

可以看一下我以前做过的笔记&#xff1a;黑马点评 短信登录部分 基于session实现登录流程 1.发送验证码 用户在提交手机号后&#xff0c;会校验手机号是否合法&#xff0c;如果不合法&#xff0c;则要求用户重新输入手机号 如果手机号合法&#xff0c;后台此时生成对应的验…...

反转链表 - 力扣(LeetCode)C语言

206. 反转链表 - 力扣&#xff08;LeetCode&#xff09;( 点击前面链接即可查看题目) /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* reverseList(struct ListNode* head) {if(head NULL)…...

【Linux】进程间通信(1):进程通信概念与匿名管道

人与人之间是如何通信的&#xff1f;举个简单的例子&#xff0c;假如我是月老&#xff0c;我要为素不相识的但又渴望爱情的男女两方牵红线。我需要收集男方的信息告诉女方&#xff0c;收集女方的信息告诉男方&#xff0c;然后由男女双方来决定是否继续。对于他们而言&#xff0…...

Spring从入门到精通 01

文章目录 1. 依赖注入 (Dependency Injection, DI)2. 面向切面编程 (Aspect-Oriented Programming, AOP)3. 事务管理4. 简化 JDBC 开发5. 集成各种框架和技术6. 模块化和扩展性&#xff1a;主要的 Spring 模块&#xff1a;Core Container&#xff1a;AOP 模块&#xff1a;Data …...

C语言经典习题25

冒泡排序 对一维数组进行升序排序&#xff0c;然后在数组中输入20个数&#xff0c;将排序后的结果打印输出。 #include<stdio.h> #define N 20 int main() {int a[N];int i;for(i0;i<N;i) //初始化数组的数 {scanf("%d",&a);}for(i0;…...

2-47 基于matlab的时域有限差分法(FDTD法)拉夫等效原理进行时谐场外推

基于matlab的时域有限差分法(FDTD法)拉夫等效原理进行时谐场外推。外推边界距离吸收边界的距离、电磁场循环、傅立叶变换提起幅值和相位、各远区剖分点电场、方向系数计算等操作&#xff0c;得出可视化结果。程序已调通&#xff0c;可直接运行。 2-47 时域有限差分法(FDTD法) 拉…...

JupyterNotebook快捷键 自用

COMMAND MODE —————————————————————————————— Up Down cells的上下选择 A B 在上/下方插入cell C V X 复制/粘贴/剪切cell 双击D 删除所选cell Z 恢复被删除的cell 双击I Interrupt中断内核 Shift Enter 运行cell并选择下方 EDIT MODE ———…...

【我的OpenGL学习进阶之旅】讲一讲GL_TEXTURE_2D和GL_TEXTURE_EXTERNAL_OES的区别

在使用OpenGL ES进行图形图像开发时,我们常使用GL_TEXTURE_2D纹理类型,它提供了对标准2D图像的处理能力。这种纹理类型适用于大多数场景,可以用于展示静态贴图、渲染2D图形和进行图像处理等操作。 另外,有时我们需要从Camera或外部视频源读取数据帧并进行处理。这时,我们…...

Makefile 如何将生成的 .o 文件放到指定文件夹

研究了不少文章&#xff0c;我行通了一个&#xff0c;但是也不全&#xff0c;目前只能适用当前文件夹&#xff0c;如果源文件有子文件夹处理不了&#xff0c;还得继续研究。很多人说编译完把O文件移动走或者直接删掉。我想说的是不符合我的要求&#xff0c;移走或者删除O文件&a…...

聊一聊知识图谱结合RAG

因为最近在做一些关于提高公司内部使用的聊天机器人的回答准确率&#xff0c;并且最近微软官方也是开源了一下graphrag的源码&#xff0c;所以想聊一聊这个知识图谱结合rag。 rag在利用私有数据增强大模型回答的领域是一种比较典型的技术&#xff0c;也就是我们提出问题的时候&…...

Java面试锦集 之 一、Java基础(1)

一、Java基础&#xff08;1&#xff09; 1.final 关键字的作用&#xff1f; 修饰变量&#xff1a; 一旦被赋值&#xff0c;就不能再被修改&#xff0c;保证了变量值的稳定性。 例&#xff1a; final int NUMBER 10; //之后就不能再改变 NUMBER 的值了。修饰方法&#xff1a;…...

【leetcode】排列序列

给出集合 [1,2,3,...,n]&#xff0c;其所有元素共有 n! 种排列。 按大小顺序列出所有排列情况&#xff0c;并一一标记&#xff0c;当 n 3 时, 所有排列如下&#xff1a; "123""132""213""231""312""321" 给定…...

【Cesium开发实战】视频融合功能的实现,可自定义位置和视频路径

Cesium有很多很强大的功能,可以在地球上实现很多炫酷的3D效果。今天给大家分享一个视频融合功能。 1.话不多说,先展示 视频融合 2.设计思路 点击绘制开始在地图上绘制视频融合的点位,形成视频播放的区域,双击弹框输入名称和要播放视频的路径,即可对应区域播放对应视频,…...

【秋招笔试题】小明的美食

解析&#xff1a;思维题。由于需要互不相同&#xff0c;每次操作取重复的值与最大值相加即可&#xff0c;这样即可保证相加后不会新增重复的值。因此统计重复值即可。 #include <iostream> #include <algorithm>using namespace std; const int maxn 1e5 5; int…...

基于OpenLCA、GREET、R语言的生命周期评价方法、模型构建及典型案例应用

生命周期分析 (Life Cycle Analysis, LCA) 是评价一个产品系统生命周期整个阶段——从原材料的提取和加工&#xff0c;到产品生产、包装、市场营销、使用、再使用和产品维护&#xff0c;直至再循环和最终废物处置——的环境影响的工具。这种方法被认为是一种“从摇篮到坟墓”的…...

Linux操作系统 -socket网络通信

同一台主机之间的进程 1.古老的通信方式 无名管道 有名管道 信号 2、IPC对象通信 system v 消息队列 共享内存 信号量集 由于不同主机间进程通信 3.socket网络通信 国际网络体系结构&#xff1a; 七层OSI模型(理论…...

【苍穹】完美解决由于nginx更换端口号导致无法使用Websocket

一、报错信息 进行到websocket开发的过程中&#xff0c;遇到了前端报错&#xff0c;无法连接的提示&#xff1a; 经过F12排查很明显是服务端和客户端并没有连接成功。这里就涉及到之前的坑&#xff0c;现在需要填上了。 二、报错原因和推导 应该还记得刚开苍穹的第一天配置前…...

Qt中在pro中实现一些宏定义

在pro文件中利用 DEFINES 定义一些宏定义供工程整体使用。&#xff08;和在cpp/h文件文件中定义使用有点类似&#xff09;可以利用pro的中的宏定义实现一些全局的判断 pro中实现 #自定义一个变量 DEFINES "PI\"3.1415926\"" #自定义宏 DEFINES "T…...

bash XXX.sh文件和直接运行XXX.sh的区别

区别&#xff1a; bash XXX.sh 明确说明使用bash作为脚本的解释器不需要文件有执行权限 XXX.sh 需要指定相关解释器。如果第一行是#!/bin/bash则使用bash&#xff0c;如果是#!/bin/sh&#xff0c;则使用sh作为解释器需要有执行权限:通过chmod x 文件名指定 注意: #!是特殊标…...

【Python机器学习】k-近邻算法简单实践——改进约会网站的配对效果

需求背景&#xff1a; XX一直使用约会网站寻找适合自己的约会对象&#xff0c;ta会把人分为3种类型&#xff1a; 不喜欢、魅力一般、非常有魅力 对人分类轴&#xff0c;发现了对象样本的以下3种特征&#xff1a; 1、每年获得的飞行里程数 2、玩视频游戏所耗时间百分比 3、…...

vue3前端开发-小兔鲜项目-登录组件的开发表单验证

vue3前端开发-小兔鲜项目-登录组件的开发表单验证&#xff01;现在开始写登录页面的内容。首先这一次完成基础的首页按钮点击跳转&#xff0c;以及初始化一些简单的表单的输入验证。后期还会继续完善内容。 1&#xff1a;首先还是准备好login页面的组件代码内容。 <script …...

Winform上位机TCP客户端/服务端、串口通信

Winform上位机TCP客户端/服务端、串口通信 背景 日常练习&#xff0c;着急换工作&#xff0c;心态都快乱了。 工具 串口调试助手 网络调试助手 代码 客户端 using Microsoft.VisualBasic.Logging; using System.Net.Sockets; using System.Text;namespace TcpClientDem…...

Linux基础复习(二)

前言 本文介绍了一下Linux命令行基本操作及网络配置 一、 命令行提示含义 [当前用户主机名 工作目录]$ 若当前用户是root&#xff0c;则最后一个字符为# 否则&#xff0c;最后一个字符为$ 二、常用Linux命令及其解释 修改主机名 一般在创建一台主机后会使用hostname相关命…...

nginx漏洞修复 ngx_http_mp4_module漏洞(CVE-2022-41742)【低可信】 nginx版本升级

风险描述&#xff1a; Nginx 是一款轻量级的Web服务器、反向代理服务器。 Nginx 的受影响版本中的ngx _http_mp4_module模块存在内存越界写入漏洞&#xff0c;当在配置中使用 mp4 directive时&#xff0c;攻击者可利用此漏洞使用使用ngx_http_mp4_module模块处理特制的音频或视…...

网格布局 HTML CSS grid layout demo

文章目录 页面效果代码 (HTML CSS)参考 页面效果 代码 (HTML CSS) <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"…...