Java中Pattern、Matcher使用过程中的内存泄漏风险

2024-01-22 18:52

本文主要是介绍Java中Pattern、Matcher使用过程中的内存泄漏风险,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.前言

前几天遇到了一个由正则表达式引起的线上事故,来跟大家分享下,希望能够帮助到大家,具体的排查过程请见
Java中的JVM指令和Arthas以及Dump文件(jvisualvm和MemoryAnalyzer工具)整体分析

先看以下代码

        Pattern pattern = Pattern.compile(input, Pattern.MULTILINE);Matcher matcher = pattern.matcher(source);

当我们业务中有需要使用正则表达式的时候,可能会用到PatternMatcher两个类,它们是JDK编译过程中非常重要的两个类,在使用过程中需要注意以下几点:

  • Pattern在调用compile方法时里面使用大量的对象来记录相关的状态,其中包括字节数组buffer的填充,以及一些数组的拷贝,以及相关的状态变量等等,口说无凭,我们来大致看一下compile即可
  • 如果你要编译的source即目标源文件内容不是很大,或者说你在一个正则编译完之后,处理的逻辑不复杂,能够让JVM在第一时间内回收这些对象,对业务来说是没有太大影响的。
  • 如果在业务过程中使用了大量的正则表达式,在获取编译后的结果之后,要手动释放掉这些对象,否则它们将会引起内存泄漏,让服务器的CPU和内存处于一种高负载的情况

2.原因

请跟着我看下源码

    public static Pattern compile(String regex, int flags) {return new Pattern(regex, flags);}
    private Pattern(String p, int f) {pattern = p;flags = f;// to use UNICODE_CASE if UNICODE_CHARACTER_CLASS presentif ((flags & UNICODE_CHARACTER_CLASS) != 0)flags |= UNICODE_CASE;// Reset group index countcapturingGroupCount = 1;localCount = 0;if (!pattern.isEmpty()) {try {// 重点关注下compile();} catch (StackOverflowError soe) {throw error("Stack overflow during pattern compilation");}} else {root = new Start(lastAccept);matchRoot = lastAccept;}}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

    private void append(int ch, int len) {if (len >= buffer.length) {int[] tmp = new int[len+len];System.arraycopy(buffer, 0, tmp, 0, len);buffer = tmp;}buffer[len] = ch;}
    public Matcher matcher(CharSequence input) {if (!compiled) {// 这里还是用了同步锁机制synchronized(this) {if (!compiled)compile();}}Matcher m = new Matcher(this, input);return m;}

2.1 Pattern

关于Pattern这个类,可以看到正则表达式编译的大概过程,如果你的正则表达式比较复杂,建议做下拆分

2.2 Matcher

这个类负责将Pattern编译后的正则表达式与目标源文件进行匹配,它是逐个字符去匹配的过程,而且还是使用了synchronized同步锁的关键字,意味着当业务中许多地方存在匹配逻辑,是只能有一个线程进行匹配的

3.解决示例

        Pattern pattern = null;Matcher matcher = null;try {pattern =  Pattern.compile(input, Pattern.MULTILINE);matcher = pattern.matcher(source);while (matcher.find()) {// start 5542 5563ContractFunctionBody item = new ContractFunctionBody(matcher.group(), matcher.start(), matcher.end());matchedItems.add(item);}            } finally {// 显式释放资源matcher = null;pattern = null;}

这篇关于Java中Pattern、Matcher使用过程中的内存泄漏风险的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/633922

相关文章

python使用库爬取m3u8文件的示例

《python使用库爬取m3u8文件的示例》本文主要介绍了python使用库爬取m3u8文件的示例,可以使用requests、m3u8、ffmpeg等库,实现获取、解析、下载视频片段并合并等步骤,具有... 目录一、准备工作二、获取m3u8文件内容三、解析m3u8文件四、下载视频片段五、合并视频片段六、错误

javax.net.ssl.SSLHandshakeException:异常原因及解决方案

《javax.net.ssl.SSLHandshakeException:异常原因及解决方案》javax.net.ssl.SSLHandshakeException是一个SSL握手异常,通常在建立SS... 目录报错原因在程序中绕过服务器的安全验证注意点最后多说一句报错原因一般出现这种问题是因为目标服务器

gitlab安装及邮箱配置和常用使用方式

《gitlab安装及邮箱配置和常用使用方式》:本文主要介绍gitlab安装及邮箱配置和常用使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装GitLab2.配置GitLab邮件服务3.GitLab的账号注册邮箱验证及其分组4.gitlab分支和标签的

Java实现删除文件中的指定内容

《Java实现删除文件中的指定内容》在日常开发中,经常需要对文本文件进行批量处理,其中,删除文件中指定内容是最常见的需求之一,下面我们就来看看如何使用java实现删除文件中的指定内容吧... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细介绍3.1 Ja

springboot项目中整合高德地图的实践

《springboot项目中整合高德地图的实践》:本文主要介绍springboot项目中整合高德地图的实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一:高德开放平台的使用二:创建数据库(我是用的是mysql)三:Springboot所需的依赖(根据你的需求再

spring中的ImportSelector接口示例详解

《spring中的ImportSelector接口示例详解》Spring的ImportSelector接口用于动态选择配置类,实现条件化和模块化配置,关键方法selectImports根据注解信息返回... 目录一、核心作用二、关键方法三、扩展功能四、使用示例五、工作原理六、应用场景七、自定义实现Impor

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

nginx启动命令和默认配置文件的使用

《nginx启动命令和默认配置文件的使用》:本文主要介绍nginx启动命令和默认配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录常见命令nginx.conf配置文件location匹配规则图片服务器总结常见命令# 默认配置文件启动./nginx

在Windows上使用qemu安装ubuntu24.04服务器的详细指南

《在Windows上使用qemu安装ubuntu24.04服务器的详细指南》本文介绍了在Windows上使用QEMU安装Ubuntu24.04的全流程:安装QEMU、准备ISO镜像、创建虚拟磁盘、配置... 目录1. 安装QEMU环境2. 准备Ubuntu 24.04镜像3. 启动QEMU安装Ubuntu4

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解