我问这个问题,首先不是因为垃圾收集的优点。我问这个问题的主要原因是我知道Bjarne Stroustrup说过c++在某个时间点上会有一个垃圾收集器。

话虽如此,为什么还没有加入呢?c++已经有了一些垃圾收集器。这是那种“说起来容易做起来难”的事情吗?或者还有其他原因没有添加它(并且不会在c++ 11中添加)?

交叉链接:

c++的垃圾收集器

澄清一下,我理解c++最初创建时没有垃圾收集器的原因。我想知道为什么不能添加收集器。

我想要的是:

我在一个远程站点上有一个clojure程序,让我们称它为mccarthy。 我想做的是从我的笔记本电脑连接到nrepl-ritz,最好使用nrepl-ritz-jack-in。插孔在本地程序中工作良好,但似乎不能连接到远程程序。

尝试1

C-x C-f on /mccarthy:code/program/project.clj

(需要的nrepl-ritz)

m x nrepl-ritz-jack-in

结果

Emacs似乎挂起了。如果我去到*nrepl-server*缓冲区,我看到:

Exception in thread "main" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.flatland.drip.Main.invoke(Main.java:117)
    at org.flatland.drip.Main.start(Main.java:88)
    at org.flatland.drip.Main.main(Main.java:64)
Caused by: java.lang.AssertionError: Assert failed: project
    at leiningen.ritz_nrepl$start_jpda_server.invoke(ritz_nrepl.clj:23)
    at leiningen.ritz_nrepl$ritz_nrepl.doInvoke(ritz_nrepl.clj:95)

(还有很多其他的台词……)

我在我的笔记本电脑上使用了drip,而不是在mccarthy上,所以nrepl-ritz-jack-in显然没有检测到它是一个远程文件。然而,在这种情况下,常规的旧nrepl-jack-in将按预期工作。

尝试2

我还试着用莱茵写麦卡锡,开始写nrepl-ritz:

mattox@mccarthy$ lein ritz-nrepl
nREPL server started on port 42874

从我的笔记本电脑,我转发一个端口,使本地42874连接到麦卡锡的42874:

ssh -L 42874:localhost:42874 -N mccarthy

然后,从我本地的Emacs:

(require 'nrepl-ritz)

m x nrepl

主持人:127.0.0.1

端口:42874

这给了我一个联系:

; nREPL 0.1.7-preview
user> 

为了验证,我跑了

m x nrepl-ritz-threads

它给了我一个很好的线程表。

m x nrepl-ritz-break-on-exception

user> (/ 1 0)

结果

这会挂起,但有时会显示一个隐藏的调试缓冲区,其中有一些重启可用。如果我告诉它将异常传递回程序,它永远不会将控制权交还给REPL。

我已经做了大量的搜索,但没有能够得到任何更具体的比“确保lein在你的路径上”(我确实这样做了,在两台机器上…)

什么是JavaScript垃圾收集?为了编写更好的代码,web程序员了解JavaScript垃圾收集的重要方面是什么?

您是否需要处理对象并将其设置为null,或者当它们超出作用域时,垃圾收集器将清理它们?

我试图理解Java堆术语中年轻、年老和永久代的概念是什么,更具体地说,这三个代之间的交互。

我的问题是:

什么是年轻一代? 什么是老一代? 什么是永久代? 这三代人之间是怎样相互影响的?

在回答了一个关于如何使用System.gc()在Java中强制释放对象的问题(这个人正在清除1.5GB的HashMap)后,我被告知手动调用System.gc()是一种糟糕的做法,但评论并不完全令人信服。此外,似乎没有人敢对我的回答投赞成票,也没有人敢投反对票。

我在那里被告知这是一种糟糕的做法,但后来我又被告知垃圾收集器的运行不再系统地停止整个世界,而且JVM也只能有效地将其用作提示,所以我有点不知所措。

我知道JVM通常比您更了解何时需要回收内存。我也明白,担心几千字节的数据是愚蠢的。我也明白,即使是兆字节的数据也不如几年前了。但还是1.5 gb ?你知道大概有1.5 GB的数据在内存中;这又不是瞎猜的。System.gc()在系统上是坏的,还是在某个点上变得正常了?

所以这个问题实际上是双重的

Why is or isn't it bad practice to call System.gc()? Is it really merely a hint to the JVM under certain implementations, or is it always a full collection cycle? Are there really garbage collector implementations that can do their work without stopping the world? Please shed some light over the various assertions people have made in the comments to my answer. Where's the threshold? Is it never a good idea to call System.gc(), or are there times when it's acceptable? If so, what are those times?

我需要知道什么时候在JVM中调用finalize()方法。我创建了一个测试类,当finalize()方法被重写时写入文件。它没有被执行。有人能告诉我为什么它不能执行吗?

在。net中,在什么情况下我应该使用GC.SuppressFinalize()?

使用这种方法给我带来了什么好处?

我有点搞不懂JavaScript的删除操作符。以下面这段代码为例:

var obj = {
    helloText: "Hello World!"
};

var foo = obj;

delete obj;

执行这段代码后,obj为空,但foo仍然引用与obj完全相同的对象。我猜这个对象就是foo指向的那个对象。

这让我很困惑,因为我以为写delete obj删除的是obj在内存中所指向的对象——而不仅仅是变量obj。

这是因为JavaScript的垃圾收集器是在保留/释放的基础上工作的,所以如果我没有任何其他变量指向对象,它将从内存中删除?

(顺便说一下,我的测试是在Safari 4中完成的。)

我正在写一个服务器,当收到请求时,我将每个动作发送到一个单独的线程。我这样做是因为几乎每个请求都要进行数据库查询。我正在使用线程池库来减少线程的构造/破坏。

我的问题是:对于这样的I/O线程,什么是一个好的截断点?我知道这只是一个粗略的估计,但我们说的是几百吗?成千上万的吗?

我怎么才能算出这个界限呢?


编辑:

感谢大家的回复,似乎我只是要测试一下,以找出我的线程数上限。问题是:我怎么知道我已经达到上限了呢?我到底应该测量什么?