我们发布了一个Java应用程序,其内存需求可能会有很大差异,具体取决于它正在处理的数据大小.如果未设置最大VM(虚拟内存)大小,则JVM通常会在大数据上因GC失败而退出.
我们希望看到的是,JVM请求更多内存,因为GC无法提供足够的内存,直到总可用VM耗尽为止.例如,以128Mb开始,并在GC失败时增加几何(或其他一些步骤).
JVM("Java")命令行允许显式设置最大VM大小(各种-Xm*命令),并且您认为这将被设计为足够的.我们尝试在随应用程序提供的.cmd文件中执行此操作.但是如果你选择任何特定的数字,你会得到两种不良行为之一:1)如果你的数量足够小,可以在大多数目标系统上工作(例如,1Gb),那么它对于大数据来说不够大,或者2)如果如果它非常大,JVM拒绝在实际VM小于指定的系统上运行.
如何设置Java以在需要时使用可用的VM,而不事先知道这个数字,并且在启动时没有抓住它?
我遇到了MS C编译器重新排序某些语句的问题,这些语句在多线程上下文中非常关键,处于高优化级别.我想知道如何在特定的地方强制订购,同时仍然使用高水平的优化.(在低优化级别,此编译器不重新排序语句)
以下代码:
ChunkT* plog2sizeChunk=...
SET_BUSY(plog2sizeChunk->pPoolAndBusyFlag); // set "busy" bit on this chunk of storage
x = plog2sizeChunk->pNext;
Run Code Online (Sandbox Code Playgroud)
产生这个:
0040130F 8B 5A 08 mov ebx,dword ptr [edx+8]
00401312 83 22 FE and dword ptr [edx],0FFFFFFFEh
Run Code Online (Sandbox Code Playgroud)
其中pPoolAndBusyFlag的写入由编译器重新排序,在pNext fetch 之后发生.
SET_BUSY本质上是
plog2sizeChunk->pPoolAndBusyFlag&=0xFFFFFFFeh;
Run Code Online (Sandbox Code Playgroud)
我认为编译器已经正确地决定重新排序这些访问是可行的,因为它们是同一结构的两个独立成员,并且这种重新排序对单线程执行的结果没有影响:
typedef struct chunk_tag{
unsigned pPoolAndBusyFlag; // Contains pointer to owning pool and a busy flag
natural log2size; // holds log2size of the chunk if Busy==false
struct chunk_tag* pNext; // holds pointer to next block of same size
struct …Run Code Online (Sandbox Code Playgroud) 从我所读到的,代码混淆并不是那么难以"破解",它只会延迟不可避免的.在那种情况下,它的目的是什么?
如果有人真的想偷你的来源他们可以.
如果有人需要查看您的源代码以获取无害/有用的目的,他们就不能.
您可能不应该在代码中存储任何敏感内容,因此这不应该是一个问题.
如果你没有混淆,你仍然没有提供完整的源代码,所以你可以出售"源代码许可证".
有趣的是,我见过的唯一代码混淆是可怕的代码,其中有错误.我需要查看代码的唯一原因是弄清楚问题是什么以及我可以做些什么来解决它.
例如,我需要替换ASPDotNetStoreFront中的一些图像.在查找标签的位置时,我发现它们包含在已编译的代码中.废话.所以我想我会反编译代码,找出要通过Regex替换的img标签.我试图查看源代码,看看哪些图像可能来自给定的编译方法,而反射器无法处理它,我认为是因为混淆.我没有时间去寻找de-comilers/de-obfuscators.
我正在寻找像这样的功能
public bool IsAReservedWord(string TestWord)
Run Code Online (Sandbox Code Playgroud)
我知道我可以通过从MSDN获取一个保留单词列表来自己动手.但是我希望有一些内置于语言或.NET反射中的内容可以依赖,所以当我转移到更新版本的C#/ .NET时,我不必重新访问该函数.
我正在寻找这个的原因是我正在寻找.tt文件代码生成的安全措施.
如果分发了这个二进制文件,则每个c程序都转换为机器代码.由于计算机的指令集众所周知,是否可以取回C原始程序?
我是C的新手,我正在阅读有关递归的内容,但我完全感到困惑.
我感到困惑的主要部分是当达到退出条件时,事情是如何放松的.我想知道在递归值中如何从堆栈推送和弹出.
也有人可以给我一个递归的图解视图吗?
谢谢...
我有一个源自ANTLR Parser Generator for Java的AST.我想要做的是以某种方式构建源代码的控制流图,其中每个语句或表达式是唯一的节点.我知道必须有一些这种识别的递归,我想知道你会建议什么是最好的选择,如果ANTLR有一个工具集我可以用于这项工作.干杯,克里斯
编辑 - 我主要关心的是从AST获得控制流图(CFG).这样我就可以获得源代码的树形表示.为了澄清,源代码和实现语言都是Java.
我已经实现了PARLANSE,这是MS Windows下的一种语言,它使用cactus栈来实现并行程序.堆栈块被分配在每个功能的基础上,并只处理局部变量的大小合适,表达温度推/持久性有机污染物,并调用库(包括存储库程序工作在堆栈空间).在实践中,这样的堆栈帧可以小到32个字节,并且通常是这样.
这一切都很有效,除非代码做了一些愚蠢的事情并导致硬件陷阱......此时Windows似乎坚持在堆栈上推送整个x86机器上下文.如果包含FP/MMX /等,则大约500多个字节.寄存器,它做的.当然,32字节堆栈上的500字节推送会破坏它不应该的东西.(硬件在陷阱上推了几个字,但不是整个上下文).
[编辑2012年11月27日:请参阅此测量的细节上堆叠的荒谬量Windows实际上推动 ]
我可以让Windows在其他地方存储异常上下文块(例如,到特定于线程的位置)吗?然后软件可以对线程进行异常命中并处理它而不会溢出我的小堆栈帧.
我不认为这是可能的,但我想我会问更多的观众.是否有OS标准调用/接口可能导致这种情况发生?
如果我可以让MS让我的进程可选地定义一个上下文存储位置"contextp",那么在操作系统中这样做是微不足道的,这个位置被初始化以默认启用当前的遗留行为.然后替换中断/陷阱向量代码:
hardwareint: push context
mov contextp, esp
Run Code Online (Sandbox Code Playgroud)
...... ......
hardwareint: mov <somereg> contextp
test <somereg>
jnz $2
push context
mov contextp, esp
jmp $1
$2: store context @ somereg
$1: equ *
Run Code Online (Sandbox Code Playgroud)
保存somereg等所需的明显变化
[我现在做的是:检查每个函数的生成代码.如果它有可能生成陷阱(例如,除以零),或者我们正在调试(可能是坏指针deref等),请为FP上下文添加足够的空间到堆栈帧.堆栈帧现在最终大小约为500-1000字节,程序无法递归到目前为止,这对我们正在编写的应用程序来说有时是一个真正的问题.所以我们有一个可行的解决方案,但它使调试变得复杂]
编辑8月25日:我已经成功地将这个故事告诉了一位微软的内部工程师,他有权明确地找出MS中谁可能真正关心的人.解决方案可能有微弱的希望.
编辑9月14日:MS Kernal Group Architect听过这个故事并且很有同情心.他说MS将考虑一个解决方案(如提议的解决方案),但不太可能在服务包中.可能必须等待下一版本的Windows.(叹气......我可能会变老......)
编辑:2010年9月13日(1年后).微软没有采取任何行动.我最近的噩梦:在Windows X64上运行一个32位进程的陷阱,在中断处理程序伪造推动32位上下文之前,将整个X64上下文推送到堆栈上?那甚至更大(两倍宽的整数寄存器,两倍的SSE寄存器(?))?
编辑:2012年2月25日:( 1.5年过去了......)微软没有反应.我猜他们只是不关心我的并行性.我认为这对社区不利; MS在正常情况下使用的"大堆栈模型"限制了通过食用大量VM可以在任何一个瞬间生存的并行计算量.PARLANSE模型将允许一个应用程序在运行/等待的各种状态下具有一百万个活"谷粒"; 这在我们的一些应用程序中确实发生,其中"并行"处理了1亿个节点图.PARLANSE方案可以使用大约1Gb的RAM来实现这一点,这是非常易于管理的.如果您尝试使用MS 1Mb"大堆栈",那么您只需要10 ^ 12个字节的VM用于堆栈空间,我非常确定Windows不会让您管理一百万个线程.
编辑:2014年4月29日:( 4年过去了). 我想MS只是不读SO. 我已经在PARLANSE上完成了足够的工程设计,因此我们只需要在调试期间支付大型堆栈帧的价格,或者当FP操作正在进行时,所以我们设法找到非常实用的方法来实现这一点.MS继续令人失望; 各种版本的Windows推送到堆栈上的东西量似乎变化很大,而且非常严重地超出了对硬件环境的需求.有一些暗示,这种可变性是由于非MS产品坚持(例如防病毒)在异常处理链中嗤之以鼻; 为什么他们不能从我的地址空间之外做到这一点?任何,我们通过简单地为FP /调试陷阱添加一个大的slop因子,并等待超过该数量的字段中不可避免的MS系统来处理所有这些.
stack-overflow assembly exception cpu-registers threadcontext
我知道LL与LR解析器的基本区别.我也知道GLR,SLR和LALR都是LR解析器的扩展.所以我的问题更多细节是......
给定一个LL(*)解析器和LR解析器的任何变体,是否有任何语言可以在一个而不是另一个中描述?或者更简单的是,是否有任何功能或属性无法表达?
作为一个具体的例子.如果我要使用LL(*)解析器创建一种语言,我是否会遇到我想要添加到我的语言中的所需功能/属性,这只能通过LR解析器实现(反之亦然)?
programming-languages parser-generator ll-grammar lr-grammar
假设有一个声明:
struct A { static int i; };
A a;
Run Code Online (Sandbox Code Playgroud)
据我所知,输入字符串int decltype(a)::i = 0;没有严格描述的行为.
它可以被解析为int decltype(a)::i = 0;,其中:
int是DECL说明符和decltype(a)::i的declarator.
但是,它可以被解析为int decltype(a) ::i = 0;,在哪里
int和decltype(a)被解析为decl-specifers,并且::i是全局变量的(重新)声明i- 编译器应该给出一个错误消息,其类似于"一个decl-specifier-seq不应该包含两个类型 -说明符 ".
我清楚地知道解析的第一种方法应该是正确的,但我找不到任何证据.
无论如何,in int A::a = 0;,A肯定会被解析为declarator因为A是类型名称并且如标准中所述
如果一个类型名称在解析DECL说明符-SEQ遇到,它被解释为部分DECL说明符-SEQ当且仅当没有以前的类型说明符之外的其他CV-预选赛在DECL说明符--seq.
在constrant中, …
c ×3
assembly ×2
java ×2
parsing ×2
.net ×1
c# ×1
c++ ×1
command-line ×1
control-flow ×1
disassembly ×1
exception ×1
grammar ×1
ll-grammar ×1
lr-grammar ×1
obfuscation ×1
recursion ×1
volatile ×1