小编dsp*_*pyz的帖子

Java使用的内存远远多于使用-Xmx分配的内存

我有一个项目,我正在编写一个类,其中教授说我们不允许使用超过200米我用-Xmx50m限制堆栈内存到50米(只是为了绝对肯定)但是根据顶部,它仍然使用300米

我尝试运行Eclipse Memory Analyzer,它只报告26米

这可能都是堆栈上的内存吗?我很确定我从不会超过大约300个方法调用深度(是的,它是一个递归DFS搜索),所以这意味着每个堆栈帧几乎用完了看起来很难相信的兆字节.

该程序是单线程的.有谁知道我可能减少内存使用的任何其他地方?另外,如何检查/限制堆栈使用的内存量?

更新:我现在使用以下JVM选项没有效果(根据顶部仍然约300米): -Xss104k -Xms40m -Xmx40m -XX:MaxPermSize=1k

另一个更新:实际上,如果我让它运行一点点(带有所有这些选项)大约一半的时间它会在4或5秒后突然下降到150米(另一半它不会下降).这真的很奇怪的是我的程序没有随机(并且正如我所说的那样是单线程)所以没有理由它在不同的运行中表现不同

它可能与我正在使用的JVM有关吗?

java version "1.6.0_27"
OpenJDK Runtime Environment (IcedTea6 1.12.3) (6b27-1.12.3-0ubuntu1~10.04)
OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)
Run Code Online (Sandbox Code Playgroud)

根据java -h,默认的JVM是-server.我尝试添加-cacao和现在(所有其他选项)它只有59米.所以我想这解决了我的问题.谁能解释为什么这是必要的?另外,我应该知道有什么缺点吗?

还有一个更新:与服务器相比,可可真的很慢.这是一个糟糕的选择

java memory stack memory-management

24
推荐指数
4
解决办法
2万
查看次数

coq Set或Type如何成为命题

我正在阅读关于Coq的教程.它构造一个bool类型如下:

Coq < Inductive bool :  Set := true | false.
bool is defined
bool_rect is defined
bool_ind is defined
bool_rec is defined
Run Code Online (Sandbox Code Playgroud)

然后它显示了这些东西正在使用"检查".

Coq < Check bool_ind.
bool_ind
     : forall P : bool -> Prop, P true -> P false -> forall b : bool, P b

Coq < Check bool_rec.
bool_rec
     : forall P : bool -> Set, P true -> P false -> forall b : bool, P b

Coq < Check bool_rect.
bool_rect
     : …
Run Code Online (Sandbox Code Playgroud)

types set boolean-expression coq first-order-logic

12
推荐指数
1
解决办法
1524
查看次数

引发多少开销?

"并行和并发编程"中的这个图表:http://chimera.labs.oreilly.com/books/1230000000929/ch03.html#fig_kmeans-granularity起初似乎表明存在严重的开销,引发太多.但是如果仔细观察y轴,你会发现它已被放大到有趣的部分.事实上,最佳和最差案例表现之间的比例约为80%,这也不算太糟糕.

一般来说,确定块的方式和数量是困难的,容易出错,极其特定于应用程序,并且明年当您购买具有更强处理能力的新计算机时可能会发生变化.我更倾向于总是使用rpar来获得最细粒度的物品并以25%的开销生活.

引发的开销通常会产生比此图所示更糟糕的成本吗?(特别是如果我总是折叠二叉树而不是列表,那么关于"顺序工作量"的第二个要点不适用)


针对Don Stewart的回答更新了问题:

火花池是否只包含一个所有处理器都难以访问的队列?还是有很多?

例如,如果我有一台具有无限处理器和二叉树的计算机,我想在所有叶子上取总和,如:

data Node = Leaf Int | Branch Node Node

sumL (Leaf x) = x
sumL (Branch n1 n2) = let (x,y) = (sumL n1, sumL n2) in (x `par` y) `seq` (x + y) 
Run Code Online (Sandbox Code Playgroud)

这个程序会在O(#leaves)时间运行吗?或O(深度)时间?有没有更好的方法来写这个?

如果我抽出太多东西以获得满意的答案,请告诉我.我对haskell并行性如何工作的心理模型仍然非常模糊.

parallel-processing multithreading haskell overhead moores-law

12
推荐指数
1
解决办法
301
查看次数

弹性Mapreduce Map输出丢失

我正在Amazon Elastic MapReduce上运行大型(超过100个节点)系列的mapreduce作业.

在reduce阶段,已经完成的map任务会随之失败

Map output lost, rescheduling: getMapOutput(attempt_201204182047_0053_m_001053_0,299) failed :
java.io.IOException: Error Reading IndexFile
    at org.apache.hadoop.mapred.IndexCache.readIndexFileToCache(IndexCache.java:113)
    at org.apache.hadoop.mapred.IndexCache.getIndexInformation(IndexCache.java:66)
    at org.apache.hadoop.mapred.TaskTracker$MapOutputServlet.doGet(TaskTracker.java:3810)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1221)
    at org.apache.hadoop.http.HttpServer$QuotingInputFilter.doFilter(HttpServer.java:835)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1212)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:399)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:450)
    at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:326)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:928)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:549)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
Caused by: java.io.EOFException
    at java.io.DataInputStream.readFully(DataInputStream.java:180)
    at java.io.DataInputStream.readLong(DataInputStream.java:399)
    at org.apache.hadoop.mapred.SpillRecord.<init>(SpillRecord.java:74)
    at org.apache.hadoop.mapred.SpillRecord.<init>(SpillRecord.java:54)
    at org.apache.hadoop.mapred.IndexCache.readIndexFileToCache(IndexCache.java:109)
    ... 23 more
Run Code Online (Sandbox Code Playgroud)

映射器针对这种情况的比例很少,足,我不会介意,只是当它,减速机全部暂停,等待1地图任务重新运行所以整个工作一直暂停,每次1-5分钟. …

hadoop jetty amazon-web-services amazon-emr elastic-map-reduce

10
推荐指数
1
解决办法
1645
查看次数

如何在迭代它时从std :: set中删除元素

如何从std::set迭代中删除元素

我的第一次尝试看起来像:

set<T> s;

for(set<T>::iterator iter = s.begin(); iter != s.end(); ++iter) {
    //Do some stuff
    if(/*some condition*/)
        s.erase(iter--);
}
Run Code Online (Sandbox Code Playgroud)

但是如果我们想要从集合中删除第一个元素,那么这是有问题的,因为iter--迭代器无效.

这样做的标准方法是什么?

c++ stl coding-style set

10
推荐指数
1
解决办法
1万
查看次数

如何用"和"与"或"并行"双方"短路

haskell是否具有并行"和"方法

parAnd :: Bool -> Bool -> Bool
Run Code Online (Sandbox Code Playgroud)

这样的

(a `parAnd` b)
Run Code Online (Sandbox Code Playgroud)

一旦a或b评估为假(并且不等待另一个),将并行激发a和b的并行评估并返回false?

有没有办法实现这样的事情?

parallel-processing haskell short-circuiting

10
推荐指数
2
解决办法
165
查看次数

使用-1作为unsigned(size_t)类型的标志值

我使用-1作为返回类型为size_t(无符号类型)的函数的标志值.

我一开始并没有注意到它,特别是因为它没有导致我的代码中的任何错误(我用x == -1,而不是x <0来检查它).

是否有任何微妙的原因我不应该留下它?什么时候这可能出乎意料?这是常用的吗?

ptrdiff_t不太常见,输入时间较长,而且无论如何它都不是合适的类型,因为函数会将索引返回到数组中.

c c++ d twos-complement

9
推荐指数
2
解决办法
1494
查看次数

你会写seq xx吗?

关于seq如何在Haskell中运行,我并不完全清楚.

似乎有很多情况下写它会很有用

seq x x
Run Code Online (Sandbox Code Playgroud)

甚至可能定义一个函数:

strict x = seq x x
Run Code Online (Sandbox Code Playgroud)

但是这样的功能还不存在,所以我猜这种方法在某种程度上是错误的.有人能告诉我这是否有意义或有用吗?

haskell lazy-evaluation

9
推荐指数
4
解决办法
727
查看次数

如何声明let中定义的函数的类型

我想写一些类似的东西:

f :: (a -> b) -> a -> c -> b
f g =
   let inner :: a -> c -> b
       inner x y = g x
   in inner
Run Code Online (Sandbox Code Playgroud)

但是这给了我一个错误.因为它没有意识到我正在尝试引用与声明中相同的"a"和"b"类型作为f

我怎样才能明确地给出内在的正确类型?

haskell typechecking nested-function

9
推荐指数
2
解决办法
303
查看次数

为什么不能将C++ set迭代器强制转换为bool?

对于STL集合,您似乎应该能够说:

if(s.find(x)) {
    //Something
}
Run Code Online (Sandbox Code Playgroud)

而不是

if(s.find(x) != s.end()) {
    //Something
}
Run Code Online (Sandbox Code Playgroud)

此外,如果set-iterators可以转换为bool(如果内部指针不为null,则为true),您将能够.为什么STL set迭代器没有这个简单的功能?故意遗漏了吗?

澄清:

或者,set可以只有一个set :: contains(x)方法直接返回一个bool,但这似乎也没有实现.我知道它只有几个字符,但是在s是某个函数的返回值的情况下,这可能会令人沮丧,因为需要创建一个临时变量,即(假设m是类型map<int,set<int>>)

const set<int>& s = m[i];
return s.find(x) != s.end();
Run Code Online (Sandbox Code Playgroud)

而不是

return m[i].contains(x);
Run Code Online (Sandbox Code Playgroud)

要么

return m[i].find(x);
Run Code Online (Sandbox Code Playgroud)

编辑:

我没有意识到count()方法可以用作contains().投票结束,因为这个问题没有正确地说出我真正应该问的问题:STL :: set是否有"包含"方法?

c++ stl casting boolean set

8
推荐指数
1
解决办法
3803
查看次数