你能尝试/捕获java中的堆栈溢出异常吗?它似乎在抛出自己的方式.当我的程序溢出时,我想"惩罚"那个价值.
我们在高负载下运行的节点环境存在问题,而我们无法找到源代码.
一点背景:我们正在使用Express为http框架运行集群节点应用程序.目前,有3个盒子,每个盒子有8个CPU核心,每个盒子运行一个由6个节点工作者组成的集群.设置似乎很好,我已经研究了所有建议的方法,我相信设置是可靠的.我们使用Express 2.5.11和XMLHttpRequest 1.4.2运行node.js 0.8.1.
问题在于:我们正在对该产品进行"暗启动"测试(即浏览器客户端代码在后台对我们的API调用javascript ajax,但未在页面上使用或向用户显示).成功运行几分钟后,系统抛出:
[RangeError: Maximum call stack size exceeded]
Run Code Online (Sandbox Code Playgroud)
我们正在使用集群控制器(启动每个worker)中的'uncaughtException'事件来捕获错误,但是在该级别没有可用的堆栈跟踪.我已经对这个问题进行了广泛的研究,似乎找不到任何有类似错误的人.梳理完系统中的每一行代码后,这就是我所知道的:
我认为,最明显的症状是错误总是在请求完全服务之后发生.也就是说,服务器接收请求,找到正确的Express路由,调用res.send,并且完成.这对我来说真的像垃圾收集!我已经读过V8引擎有一个非常好的GC引擎,但我想知道我们的重负荷是多少影响了事情.
正如我所说,即使在基本设计上,代码也会抛出错误.取出大部分自定义代码后,这就是设置的基础知识.很抱歉,我正在这里切割,所以并不是所有的变量声明等都会被包含在内,但代码确实有效,所有这些东西都在真正的代码中:
集群控制器.这是在命令行上启动的清理版本.
cluster = require('cluster');
path = require('path');
fs = require('fs');
app = require('./nodeApi');
_ = require('underscore');
nodeUtil = require(./nodeUtil);
process.on('uncaughtException', function(err) {
var stamp;
stamp = new Date();
console.log("***************************** Exception Caught, " + stamp);
return console.log("Exception is:", err);
});
if (cluster.isMaster) {
if ((nodeUtil.isLiveServer() || nodeUtil.isCluster()) && process.env.IS_CLUSTER !== …Run Code Online (Sandbox Code Playgroud) javascript stack-overflow garbage-collection node.js express
我使用EF Code First创建了具有彼此集合的类.实体:
public class Field
{
public int Id { get; set; }
public string Name { get; set; }
public virtual List<AppUser> Teachers { get; set; }
public Field()
{
Teachers = new List<AppUser>();
}
}
public class AppUser
{
public int Id { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public string UserName => Email;
public virtual List<Field> Fields { get; set; }
public AppUser()
{
Fields …Run Code Online (Sandbox Code Playgroud) 假设您有一种方法可能会陷入无休止的方法调用循环并且崩溃并发生StackOverflowException.例如,我RecursiveSelect在这个问题中提到的天真方法.
从.NET Framework 2.0版开始,try-catch块无法捕获StackOverflowException对象,默认情况下会终止相应的进程.因此,建议用户编写代码以检测并防止堆栈溢出.例如,如果您的应用程序依赖于递归,请使用计数器或状态条件来终止递归循环.
把这些信息(来自这个答案)考虑在内,因为无法捕获异常,是否可以为这样的事情编写测试?或者对此进行测试,如果失败,实际上会打破整个测试套件?
注意:我知道我可以尝试一下,看看会发生什么,但我对它的一般信息更感兴趣.比如,不同的测试框架和测试运行器会以不同的方式处理吗?即使有可能,我应该避免这样的测试吗?
Haskell不支持循环计算,而是提供使用递归算法.但是这种方法导致堆栈增长,甚至堆栈溢出.我认为应该有办法解决这个问题.这是样本.我想知道,每5秒可以调用多次getClockTime:
import System.Time
nSeconds = 5
main = do
initTime <- totalPicoSeconds `fmap` getClockTime
doWork initTime 1
where
doWork initTime n = do
currTime <- totalPicoSeconds `fmap` getClockTime
if (currTime - initTime) `div` 10 ^ 12 >= nSeconds
then print n
else doWork initTime (n+1)
totalPicoSeconds :: ClockTime -> Integer
totalPicoSeconds (TOD a b) = a * 10 ^ 12 + b
Run Code Online (Sandbox Code Playgroud)
该程序耗时5秒,但最终我得到了:
堆栈空间溢出:当前大小为8388608字节.
使用`+ RTS -Ksize -RTS'来增加它.
在特定情况下,手动管理堆栈大小可能有所帮助,但如果我希望运行此算法10秒钟,它可能会再次溢出.所以这不是一个解决方案.我怎样才能使这段代码有效?
我正在使用java的Pattern.matches将数据块与正则表达式进行匹配.数据块可以是单行或多行.问题是,一旦我的数据超过15行(通常超过17-18行),我开始得到stackoverflower.对于少于15行的数据,正则表达式工作正常.
正则表达式的格式为:
domainname - > space - >, - > space - > number - > space - >, - > space - > number - > newline
String regex = "^(([a-zA-Z0-9][a-zA-Z0-9\\-]*\\.)+([a-zA-Z]{2,})\\s*,\\s*\\d+\\s*,\\s*\\d+(\\r?\\n)?)+$";
Run Code Online (Sandbox Code Playgroud)
我用来测试这个正则表达式的数据块就是这个
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, …Run Code Online (Sandbox Code Playgroud) 1.背景
我的Maven项目有很多的模块和子模块与jars和wars一切工作.我也可以在服务器上部署它而没有任何问题.
我决定遵循这个maven命名转换,我正在进行一些测试project.name并project.build.finalName拥有一个合适的名称.
我定义project.name为根工件创建的模式是company-${project.artifactId},对于模块和子模块是${project.parent.name}-${project.artifactId}:
模式project.build.finalName是${project.name}-${project.version}:
但maven没有生成这些文件,而是给了我一个StackOverflowError.
2.重现错误的示例
你可以从github克隆这个例子:https://github.com/pauloleitemoreira/company-any-artifact
在github中,有一个master分支,它将重现此错误.还有only-modules分支,这是一个工作示例,用于${project.parent.name}生成finalName我想要的jar .
让我们考虑一个带有一个根pom工件,一个pom模块和一个子模块的maven项目.
-any-artifact
|
|-any-module
|
|-any-submodule
Run Code Online (Sandbox Code Playgroud)
2.1任何神器
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.company</groupId>
<artifactId>any-artifact</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<name>company-${project.artifactId}</name>
<modules>
<module>any-module</module>
</modules>
<!-- if remove finalName, maven will not …Run Code Online (Sandbox Code Playgroud) 我正在玩State monad,我不知道在这段简单的代码中是什么导致了堆栈溢出.
import Control.Monad.State.Lazy
tick :: State Int Int
tick = do n <- get
put $! (n+1)
return n
million :: Int
million = snd $ runState (mapM_ (const tick) [1..1000000]) 0
main = print million
Run Code Online (Sandbox Code Playgroud)
注意 我只想知道在这段代码中导致问题的原因,任务本身本身并不重要.
对于工作中的参数优化问题,我写了一个遗传算法来找到一些好的设置,因为蛮力解决方案是不可行的.不幸的是,当我早上回来时,大部分时间我都会被送到StackOverflowException.
我已经使用F#已经有一段时间了所以我知道TCO和需要带累加器参数的函数,并且通常使用该形式.
经过大量的搜索,我认为我能够找到触发异常的代码:
breedPopulation alive |> simulate (generation + 1) lastTime ewma
Run Code Online (Sandbox Code Playgroud)
breedPopulation从当前个体中生成新一代alive.然后通过调用开始下一轮/生成simulate.当我看到反汇编(总noob)时,我发现了一些pop和a ret,所以它看起来不像是对我的常规(非尾部)调用.
mov rcx,qword ptr [rbp+10h]
mov rcx,qword ptr [rcx+8]
mov rdx,qword ptr [rbp-40h]
cmp dword ptr [rcx],ecx
call 00007FFA3E4905C0
mov qword ptr [rbp-0F0h],rax
mov r8,qword ptr [rbp-0F0h]
mov qword ptr [rbp-80h],r8
mov r8,qword ptr [rbp-78h]
mov qword ptr [rsp+20h],r8
mov r8d,dword ptr [rbp+18h]
inc r8d
mov rdx,qword ptr [rbp+10h]
mov r9,qword ptr [rbp-20h]
mov rcx,7FFA3E525960h
call 00007FFA3E4A5040 …Run Code Online (Sandbox Code Playgroud) stack-overflow ×10
java ×3
c# ×2
haskell ×2
automapper ×1
cil ×1
express ×1
f# ×1
go ×1
javascript ×1
maven ×1
monads ×1
node.js ×1
nunit ×1
recursion ×1
regex ×1
stack ×1
state-monad ×1
unit-testing ×1