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

相关文章

Spring Boot中的路径变量示例详解

《SpringBoot中的路径变量示例详解》SpringBoot中PathVariable通过@PathVariable注解实现URL参数与方法参数绑定,支持多参数接收、类型转换、可选参数、默认值及... 目录一. 基本用法与参数映射1.路径定义2.参数绑定&nhttp://www.chinasem.cnbs

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

JAVA中安装多个JDK的方法

《JAVA中安装多个JDK的方法》文章介绍了在Windows系统上安装多个JDK版本的方法,包括下载、安装路径修改、环境变量配置(JAVA_HOME和Path),并说明如何通过调整JAVA_HOME在... 首先去oracle官网下载好两个版本不同的jdk(需要登录Oracle账号,没有可以免费注册)下载完

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

Spring Boot 结合 WxJava 实现文章上传微信公众号草稿箱与群发

《SpringBoot结合WxJava实现文章上传微信公众号草稿箱与群发》本文将详细介绍如何使用SpringBoot框架结合WxJava开发工具包,实现文章上传到微信公众号草稿箱以及群发功能,... 目录一、项目环境准备1.1 开发环境1.2 微信公众号准备二、Spring Boot 项目搭建2.1 创建

Java中Integer128陷阱

《Java中Integer128陷阱》本文主要介绍了Java中Integer与int的区别及装箱拆箱机制,重点指出-128至127范围内的Integer值会复用缓存对象,导致==比较结果为true,下... 目录一、Integer和int的联系1.1 Integer和int的区别1.2 Integer和in

Linux进程CPU绑定优化与实践过程

《Linux进程CPU绑定优化与实践过程》Linux支持进程绑定至特定CPU核心,通过sched_setaffinity系统调用和taskset工具实现,优化缓存效率与上下文切换,提升多核计算性能,适... 目录1. 多核处理器及并行计算概念1.1 多核处理器架构概述1.2 并行计算的含义及重要性1.3 并

SpringSecurity整合redission序列化问题小结(最新整理)

《SpringSecurity整合redission序列化问题小结(最新整理)》文章详解SpringSecurity整合Redisson时的序列化问题,指出需排除官方Jackson依赖,通过自定义反序... 目录1. 前言2. Redission配置2.1 RedissonProperties2.2 Red

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

JSONArray在Java中的应用操作实例

《JSONArray在Java中的应用操作实例》JSONArray是org.json库用于处理JSON数组的类,可将Java对象(Map/List)转换为JSON格式,提供增删改查等操作,适用于前后端... 目录1. jsONArray定义与功能1.1 JSONArray概念阐释1.1.1 什么是JSONA