java 正则 栈溢出_关于Java正则引起的StackOverFlowError问题以及解决方案 | 学步园...

java 正则异常 java.lang.StackOverflowError:

在使用正则表达式的时候,底层是通过迭代方式执行的,每一层的迭代都会在栈线程的大小中占一定内存,如果迭代的层次很多,就会报出stackOverFlowError异常。所以在使用正则的时候其实是有利有弊的。我们使用的weblogic服务器,修改了配置-Xss的大小为512K后,测试几次没有报错。现在修改成了1M,再观察一段时间。修改-Xss只是治标不治本的解决方法,要从根源上解决还需要优化正则。

以下是从网络上摘抄的:

根本原因是这样的,对于每一个线程,都有一个java栈 ,当有一个方法被调用的时候,会产生一些跟这个方法相关的信息,如方法名,参数,中间变量等等,这些叫做栈帧 ,当一个方法执行完毕  这个栈帧才会从栈顶pop掉  你递归的话  会一直向栈里push栈帧  而这个java栈是有一定的长度或深度的,当栈满了,无法再进行push的时候 就出现你上面的异常了,解决办法的话 就不要用递归操作 改用for 而且平时也不建议用递归的,效率太低了 .

参考网址:http://bbs.csdn.net/topics/370099884

栈溢出了,JVM依然是采用栈式的虚拟机,这个和C和Pascal都是一样的。函数的调用过程都体现在堆栈和退栈上了。你调用构造函数的“层”太多了,以致于把栈区溢出了。

通常来讲,一般栈区远远小于堆区的,因为函数调用过程往往不会多于上千层,而即便每个函数调用需要1K的空间(这个大约相当于在一个C函数内声明了256个int类型的变量),那么栈区也不过是需要1MB的空间。通常栈的大小是1-2MB的。通常递归也不要递归的层次过多,很容易溢出.

参考网址:http://bbs.csdn.net/topics/380047221

对java.lang.StackOverflowError的分析:

原因:运行一个程序,JVM会开辟一块内存空间去储存程序进行时的某些信息,当程序运行时需要储存的信息超过了分配的空间,就会出现那样的问题.比如死循环,

解决:首先从程序代码优化方面着手,检查是否有死循环、递归等程序,如果有,修正、优化相关代码。

参考网址:http://blog.csdn.net/gaomatrix/article/details/6604579

有时regex包中的Pattern类会抛出StackOverflowError.这是已知的bug #5050507的表现,它自从Java 1.4就存在于java.util.regex包中。这个bug仍然存在,因为它是“won't fix”的状态。这个错误的出现是因为,Pattern类把一个正则表达式编译为一个用来寻找匹配的小程序。这个程序被递归调用,有时太多的递归就会导致该错误的出现。更多细节请参考bug描述。看起来大部分是在使用选择(alternation)的出现。

参考网址:http://edu.21cn.com/java/g_189_801829-1.htm

大致的描述一下问题,有一个正则匹配,本机环境可以正常匹配,在另一台服务器也可以正常匹配,但是只有一台 不行,我就怀疑是那台机器的环境问题,结果和我想的一样。

设置jvm参数

Xss 设置成默认即可

参考网址:http://blog.knowsky.com/190676.htm

Java程序中,每个线程都有自己的Stack Space。这个Stack Space不是来自Heap的分配。所以Stack Space的大小不会受到-Xmx和-Xms的影响,这2个JVM参数仅仅是影响Heap的大小。Stack Space用来做方法的递归调用时压入Stack Frame。所以当递归调用太深的时候,就有可能耗尽Stack Space,爆出StackOverflow的错误。Stack Space的大小随着OS,JVM以及环境变量的大小而发生变化。一般说来默认的大小是512K。在64位的系统中,这个Stack

Space值会更大。一般说来,Stack Space为128K是够用的。这时你说需要做的就是观察。如果你的程序没有爆出StackOverflow的错误,可以使用-Xss来调整Stack Space的大小为128K。(eg:-Xss128K)

参考网址:http://thomaschen2011.iteye.com/blog/1214114

从异常信息来看,很明显,线程栈空间不足,一般来说,存在这种情况,是因为方法的嵌套调用层次太深,上层的方法栈一直得不到释放,导致栈空间不足。因为正则匹配的时候,嵌套层次太深,“()”太多太深。请记住一句老话:“ 您有一个问题,用正则表达式解决。那您就有两个问题了。”

参考网址:http://www.iteye.com/topic/860654

关于:优化Java中的正则表达式

1、如果在程序中多次使用同一个正则表达式,一定要用Pattern.compile()编译,代替直接使用Pattern.matches()。如果一次次对同一个正则表达式使用Pattern.matches(),例如在循环中,没有编译的正则表达式消耗比较大。因为matches()方法每次都会预编译使用的表达式。另外,记住你可以通过调用reset()方法对不同的输入字符串重复使用Matcher对象。

2、留意选择(Beware of alternation)。类似“(X|Y|Z)”的正则表达式有降低速度的坏名声,所以要多留心。首先,考虑选择的顺序,那么要将比较常用的选择项放在前面,因此它们可以较快被匹配。另外,尝试提取共用模式;例如将“(abcd|abef)”替换为“ab(cd|ef)”。后者匹配速度较快,因为NFA会尝试匹配ab,如果没有找到就不再尝试任何选择项。(在当前情况下,只有两个选择项。如果有很多选择项,速度将会有显著的提升。)选择的确会降低程序的速度。在我的测试中,表达式“.*(abcd|efgh|ijkl).*”要比调用String.indexOf()三次——每次针对表达式中的一个选项——慢三倍。

3、获取每次使用引起小损失的分组。如果你实际并不需要获取一个分组内的文本,那么就使用非捕获分组。例如使用“(?:X)”代替“(X)”。

参考网址:http://blog.csdn.net/mydeman/article/details/1800636

(大概的意思就是,如果我们使用递归了,首先你得明白什么是递归,递归就是一个方法被调用N次。当方法被调用的时候,方法的参数,定义等信息会存在本次线程对应的java栈里。一个方法被调用N次,那就得往这个java栈里放N次。次数如果过多,那么java栈就会溢出。)

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

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

相关文章

容斥原理的二进制实现模版

最近学习容斥原理,实现容斥原理大致有三种方法:dfs,队列数组,二进制。 今天主要讲下二进制实现容斥原理: 有一个集合{A1……An},求集合的子集?很显然答案为 也就是2^n个,也就是每一个…

测试鼠标双击_鼠标环境可靠性测试是什么

鼠标和电脑是的组合,购买电脑时一般商家会送给用户一个配套的鼠标,鼠标和电脑一样,对环境的要求较高,极少部分的鼠标由于短路或者是环境温度过高的问题会导致鼠标出现自燃的现象,如果用户此时正在使用电脑编辑文件&…

snprintf函数用法

int snprintf(char *restrict buf, size_t n, const char * restrict format, ...); 函数说明:最多从源串中拷贝n-1个字符到目标串中,然后再在后面加一个0。所以如果目标串的大小为n 的话,将不会溢出。 函数返回值:若成功则返回欲写入的字符…

virtualbox主机网络管理 未能创建_如何在 VirtualBox 中增加现有虚拟机的磁盘大小 | Linux 中国...

导读:你可以在 VirtualBox 中扩大虚拟硬盘,即使在创建之后也可以。                   本文字数:1434,阅读时长大约:2分钟https://linux.cn/article-12869-1.html作者:Dimitrios Savvopoulos译者…

java 迪米特法则_迪米特法则

文章首发于个人博客 shuyi.tech,欢迎点击原文跳转阅读。 设计模式说白了就是传统经验的总结,它能让我们在合适的场景使用合适的模式,从而加快我们的编程速度,也能提高系统的扩展性、稳定性。这里我想就设计模式提出两个观点&#…

js中的==与===的区别

"": 1,如果两表达式的类型不同,则试图将它们转换为字符串、数字或 Boolean 量。 2,NaN 与包括其本身在内的任何值都不相等。 3,负零等于正零。 4,null 与 null 和 undefined 相等。 5&#x…

sql 2000 安装问题

1. 安装时报command line option syntax error.type command /?for help 去掉安装文件的中文路径 2. 安装完成后,打开企业管理器,出现mmc无法初始化管理单元。 原因是之前安装的sqlserver2000没有卸载干净 1) 彻底删除C:\Program Files\Microsoft SQL …

mysql 交换工资_LeetCode:627.交换工资

题目给定一个 salary 表,如下所示,有 m 男性 和 f 女性 的值。交换所有的 f 和 m 值(例如,将所有 f 值更改为 m,反之亦然)。要求只使用一个更新(Update)语句,并且没有中间的临时表。注意,您必只能写一个 …

usb长包数据结束判断_如何判断南桥好坏 判断南桥好坏方法介绍【详解】

南桥是电脑里重要的零部件,南桥芯片主要是负责I/O接口等一些外设接口的控制、IDE设备的控制及附加功能等等。那么南桥发生故障, 怎么判断南桥好坏 呢?一、通过测PCI槽、AGP槽对地打阻值可判定南北桥有无损坏1、PCI槽中所有的AD复合线对地打阻值都为300&…

C++ MFC界面读写USB HID设备数据程序

发一个简单易用的界面,用来对USB HID设备(比如说游戏手柄,控制面板等)读写数据,一般情况下面板上有一些LED,可以帮助我们测试读写是否正确。另外,需要可以修改vendorID和prodcutID,这样一个界面…

nano-pc-t1 4412 显示驱动分析

1. 和其它内核代码类似。 显示驱动的分析都是由 drivers/video/fbmem.c开始,fbmem.c是显示驱动的抽象,实际只是一个框架性的东西。 fbmem_init 中实现了一个字符设备驱动,并创建了class,但是没有生成设备文件。 这个字符设备驱动的…

mysql中索引约束有哪些_Mysql中索引和约束的示例语句

外键查询一个表的主键是哪些表的外键SELECTTABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME,REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAMEFROMINFORMATION_SCHEMA.KEY_COLUMN_USAGEWHERETABLE_SCHEMA mydbnameAND REFERENCED_TABLE_NAME 表名;导出所有外键语句SELECTCONCAT(ALTER …

taskkill无法终止进程 拒绝访问_解决删除文件时,提示无法删除的问题

有时我们想删除某个程序文件夹,或是卸载后残留的一些 .dll 等后缀的文件,却一直提示 “运行中” 、 “权限不足” ,甚至用第三方的强力删除功能都无法删除。这时我们可以用系统自带的命令行功能,使用几个简单的小命令就可以彻底删…

javascript删除数组里的对象

Array.prototype.del function(value) {//删除数组中指定的元素&#xff0c;返回新数组function hasValue(array, value) {for(var i 0; i < array.length; i) {if (value array[i]) {return i;}}return -1;}var position hasValue(this, value);var temp new Array ;i…

擦窗机器人测试标准_擦窗机器人,我选择玻妞的三个理由!

很多人都喜欢高层&#xff0c;一览无遗&#xff0c;广阔风景&#xff01;可现实是无论什么高层湖景都会被窗户上日积月累的灰尘遮挡的严严实实&#xff0c;每次擦窗都累到怀&#xff01;疑&#xff01;人&#xff01;生&#xff01;于是一年又一年&#xff0c;你想要的风景始终…

Oracle客户端与java_Oracle 谈 JavaFX 及 Java 客户端技术的未来

原标题&#xff1a;Oracle 谈 JavaFX 及 Java 客户端技术的未来据 Oracle 博客称&#xff0c;从 JDK 11 开始&#xff0c;Oracle 将从 JDK 中删除 JavaFX&#xff0c;但在 2022 年之前&#xff0c;Oracle 还会继续为 JDK 8 中的 JavaFX 提供商业支持。2011 年&#xff0c;JavaF…

基于Passthru的NDIS开发的个人理解

基于Passthru的NDIS开发的个人理解 这几天对NDIS的学习&#xff0c;基本思路是&#xff1a;首先熟悉理论知识→然后下载一个例子进行研究→最后例子自己模仿扩展→最最后尝试自己写一个新的。 Passthru是微软NDIS自己写的一个框架驱动&#xff0c;NDIS开发者可以在此框架上进行…

Conversion to Dalvik format failed with error 1

如题&#xff0c;解决办法是将工程中的 Android Private Libraries移除即可

char类型包括数字吗java_Java char 与 Character

1. java中char类型占2个字节、16位能够存放汉子&#xff0c;字母和数字占一个字节&#xff0c;一个字节8位&#xff0c;中文占2个字节&#xff0c;16位&#xff1b;java2. char类型赋值编码char a’a’; //任意单个字符&#xff0c;加单引号。char a’中’;//任意单个中文字&am…

HDOJ 4253 Two Famous Companies 二分+MST

题目意思&#xff1a;给出n个点&#xff0c;m条边&#xff0c;边分为两种&#xff0c;一种是A公司的&#xff0c;一种是B公司的。边上有权值&#xff0c; 问用n-1条边把n个点连起来的最小费用是多少&#xff0c;其中A公司的边刚好有k条。题目保证有解。 题解&#xff1a;题目意…