有人能帮我理解火花作业日志中出现以下几行的可能原因吗?
2018-06-11T05:35:46,181 - INFO Executor任务启动工作任务328 :登录$class@54- TID 328等待堆上执行池的至少1/2N空闲2018-06-11T05:35:46,182 - INFO Executor任务启动工作任务329:UnsafeExternalSorter@202 - Thread 151溢出50.0 MB的排序数据到磁盘(迄今20次)
2018-06-11T05:35:46,188 - INFO Executor任务启动工作者任务322:UnsafeExternalSort
我有一个问题,我使用gen server做一些简单的工作,如下所示:
one handle_cast to do a long time work(takes 60 seconds)
one handle_cast to do a very fast work
当客流量低时,一切都很好。但当服务器进程第一次长时间工作,客户端向服务器发送数以千计的消息(例如邮箱中的1000000条消息)时,长时间的工作将变得极其缓慢,可能需要600秒才能完成。
这个问题就像堆栈溢出上的这个问题。
但我还是不明白。如果是因为垃圾收集,垃圾收集怎么会花这么长时间或者这么频繁呢?
首先,我要说的是,我的问题不是堆栈溢出,而是在没有编译时错误\警告的情况下实现堆栈溢出。我知道(第一手的)您可以使用递归溢出堆栈:
void endlessRecursion()
{
int x = 1;
if(x) endlessRecursion(); //the 'if' is just to hush the compiler
}
我的问题是,是否可以通过声明太多的局部变量来溢出堆栈。最明显的方法就是声明一个大型数组,如下所示:
void myStackOverflow()
{
char maxedArrSize[0x3FFFFFFF]; //
这个问题与我目前所看到的任何错误无关,它更多的是关于理论和对HW架构设计和实现中的变化的了解。
场景1:假设16位处理器具有16位寄存器、16位寻址和sizeof(int) =16位:
unsigned int a, b, c, d;
a=0xFFFF;
b=0xFFFF;
c=a+b;
是否有可能覆盖c旁边的内存位置?
(在这种情况下,我预计在添加操作期间会出现溢出标志,c要么保持不变,要么被未定义的数据填充。)
场景2:假设32位处理器具有32位寄存器、32位寻址、sizeof(int) =32位和sizeof(短int)=16位:
unsigned int a, b;
uns
我关心的是在两个对象相互引用的情况下的垃圾回收...
public class A
{ public readonly B _b;
public A()
{ _b = new B(this);
}
}
public class B
{ public readonly A _a;
public B(A objA)
{ _a = objA;
}
}
在这种情况下,第三个类可能引用A ...
public class Foo
{ public A _a = new A(); // A and B are both created