我正在对Java程序进行非常简单的攻击。假设有人制作了一个for循环,该循环计算一个值(从一个现有值)并将其存储在HashMap中。如此反复直到可以确定的某个值。
由于外部限制,我不确定我可以透露的细节量。无论如何,这是等效的代码:
/**
* key is a PublicKey object
* value is a byte[], a member of the class
* parameter is an int, representing the number of times
* a new value must be generated
*/
void doSomethingAfterComputingValues(int parameter) {
for (int i = N; i < parameter; i++) {
myMap.get(key).put(i,value); //the map is a map of maps
value = getNextValue();
}
N = parameter+1;
workWithCurrentValue();
这时,我多次执行此函数,每次都提供一个大的parameter
。
doSomethingAfterComputingValues(200000)
doSomethingAfterComputingValues(400000)
请注意,此操作只能执行一次。我之所以多次这样做,仅仅是因为过去对parameter - N
的最大大小有限制。
在这些行的外部未触及该地图,我检查了它实际上是否在侧面增加(内部地图实际上在这么做)。
我希望堆能在短时间内完全填满,从而返回java.lang.OutOfMemoryError。 但是,似乎并非如此。相反,即使表中有32M +个条目,堆的大小似乎也很静态。我看不出原因。
可能值得指出的是,我正在Android Studio上使用junit运行代码。
有什么我想念的吗?
编辑:我提供的一段代码应该使所有内容都更加清晰。告诉我这是否足够,或者应该包括更多内容。