Tag: garbage collection

客户端最好的垃圾收集设置是什么?

最近的JVM有很多用于垃圾收集的XX参数(例如参见这里 ),但有哪些选项可以使客户端Swing应用程序真正表现更好? 我应该注意到,在客户端java应用程序中真正让我恼火的事情之一是停止世界垃圾收集的大延迟。 在Intelli-J IDEA中,我看到它需要三分钟或更长时间。 编辑:感谢所有的回复。 只是为了报告我使用此处设置的设置,为IDEA提供了CMS垃圾收集器(这是大多数读这个问题的人都熟悉的应用程序类型的一个很好的通用参考)。 我还设置-XX:+ StringCache以查看它是否会降低内存要求。 一般来说,观察是常规运行性能不会降低到可以注意到它的程度。 使用字符串缓存选项可以减少内存,但是CMS方法并不彻底,最终需要停止世界垃圾收集周期(回到三分钟等待)以清除内存(一次运行400MB)。 然而,考虑到内存占用减少,我可能只需要放置一个较小的最大内存量,这样可以使世界各地的大小更小。 IDEA 8.1.4附带JDK 1.6.0_12,所以我还没有测试G1。 此外,我的机器只有2个核心,因此G1方法不会真正最大化。 是时候打击老板换一台更好的机器了;)。

如何使用maven jvmArg解决“超出GC开销限制”?

运行类时,我有以下exception: 线程“main”中的exceptionjava.lang.OutOfMemoryError:超出了GC开销限制 我试图从类包的maven pom.xml中增加jvmArg堆大小: http://maven.apache.org/xsd/maven-4.0.0.xsd“> 4.0.0 (…) (…) (…) 4g ${project.basedir}/.. net.alchim31.maven scala-maven-plugin MyClassName (…) -Xmx${javaOpts.Xmx} (…) 我尝试了最后引用的行,其中包含许多值: -Xmx512m{javaOpts.Xmx} -Xmx4096M{javaOpts.Xmx} … -Xmx10000000000M{javaOpts.Xmx} 但对于他们所有人我都有同样的错误。 有人可以帮帮我吗? 观察:我是从IntelliJ IDEA运行的。

解决PermGen问题的各种选择

我正在研究Java 6 18 VM上垃圾收集的各种选项,并希望得到一些指示。 我们在JBoss上运行我们的应用程序,偶尔在重新部署期间会出现臭名昭着的PermGen错误。 互联网上有很多相互矛盾和过时的信息,说明解决或缓解这个问题的最佳方法。 从我所看到的 ,以下是正确的: VM选项本身无法解决此问题 ,只能推迟它。 解决此问题的唯一可靠方法是修复Application Server本身(不太可能)或Application Server中运行的代码(我们的代码或第三方库)(更有可能)中的编码错误。 Permgen的填充通常是应用程序类加载器加载到Application Server类加载器加载的对象的引用的结果,从而防止应用程序的类加载器的垃圾收集。 我有两个问题: 以上是正确的吗? VM选项CMSClassUnloadingEnabled和CMSPermGenSweepingEnabled哪里进入此区域? 从我所看到的CMSClassUnloadingEnabled取代或隐式启用CMSPermGenSweepingEnabled 。 他们中的任何一个都有助于解决上述问题吗?

JDK 8内存布局和垃圾回收

据我所知 ,从JDK 8开始,PermGen将成为java历史上的一个页面。 一切都很美好…但新的内存布局会是什么样子? 这会影响新平台上的GC吗?

Java堆中的空格/代数之间的比率是否恒定?

我已经阅读了这篇关于虚拟机垃圾收集调优的文章 ,以便更好地理解java垃圾收集器。 每个空间都有一个虚拟堆空间区域,随着所需的堆空间越来越接近最大堆大小,它可以增长。 这可以在这张图片中看到: 几代人的Java GC安排http://sofzh.miximages.com/java/190244.gif 您可以使用NewRatio参数设置Young Generation和Old(Tenured)Generation之间的比率,以及使用SurvivorRatio参数设置Eden Space和Survivor Space之间的比率。 最近这个问题被问到要找出堆空间的默认比率。 它说你应该使用PrintGCDetails参数并手动计算比率。 我的问题是:不同堆空间的大小是否以相同的比率增加,从而在应用程序的整个运行时期间保持它们在启动时设置的比率不变? 例如,如果Young Generation和Old / Tenured Generation的默认NewRatio为3,则Young的初始保留堆空间为100MB,Old为300MB。 如果需要为Old Space保留更多内存,可以说300MB以上,总计600MB。 为Young Space保留的内存是否也会增加到200MB,保持比例不变?

NewRatio参数不与CMS垃圾收集器一起使用

我为我的应用程序切换到CMS收集器,应用程序的吞吐量减少了一半。 从GC日志中,我发现很少发生轻微的GC(每秒10 per second )。 我已经分配了4G的堆大小。 默认情况下,JVM使用非常小的尺寸(小于40MB )。 我想通过增加年轻人的规模来尝试CMS。 你能指点我正确的JVM参数吗? 我尝试了-XX:NewRatio但是JVM忽略了这个参数,并且年轻的gen大小没有变化 我的java版本是java version “1.6.0_14”

java垃圾收集和null引用

在我为OCJP学习时,我遇到了以下问题: class CardBoard { Short story = 200; CardBoard go(CardBoard cb) { cb = null; return cb; } public static void main(String[] args) { CardBoard c1 = new CardBoard(); CardBoard c2 = new CardBoard(); CardBoard c3 = c1.go(c2); c1 = null; // do Stuff }} 当达到// doStuff时,有多少对象符合GC条件? 正确的答案是2,意思是c1及其story对象。 当达到// doStuff行时,c3也为空。 为什么它也不符合GC的条件?

垃圾收集操作

有人可以解释我垃圾收集是如何工作的吗? (我正在使用C#和Java)。

System.gc()由核心API调用

你们中的一些人可能知道一些核心java API会对System.gc()进行显式调用。 发生这种情况时我知道两种情况: NIO。 我相信,当系统耗尽“直接”内存时,可以对直接ByteBuffers进行一些清理。 RMI。 在这里,原因对我来说并不清楚…… 所以,问题是: 知道为什么RMI需要System.gc()吗? 当核心API(甚至其他一些流行的库)可以直接调用System.gc()时,您是否知道其他任何情况?

AsyncTasks不会被收集,导致其他AsyncTasks无法运行

我的应用程序使用了很多AsyncTasks。 毕竟它是一个网络应用程序。 当我跟踪Debug选项卡时,我注意到每个AsyncTask都说在它后面运行,在5个AsyncTasks之后,我无法启动任何AsyncTasks。 我通过将执行程序更改为THREAD_POOL_EXECUTOR来修复它,它允许合并15个线程。 但AsyncTasks仍显示为正在运行。 AsyncTasks中都有InputStreams,其中有BufferedReaders来读取JSON,但我从不在Streamer和Readers上调用close()方法。 这可能是它,或者AsyncTask在完成之后无论如何收集? 如果这是交易,那为什么我不能在我的应用程序中运行超过5个AsyncTasks? 看到我对此表示赞赏,我将更明确地解释这一点 AsyncTasks都经历了他们的方法。 除了使用不同的BasicNameValuePairs之外,所有这些都以相同的方式BasicNameValuePairs 。 我100%确定代码中没有容易出错的错误。 以下是其中一个AsyncTasks的示例: private class RunningEvent extends AsyncTask { @Override protected void onPreExecute() { if (Constants.isOnline(getApplicationContext())) { super.onPreExecute(); } else { Toast.makeText(getApplicationContext(), “No internet connection”, Toast.LENGTH_LONG).show(); return; } } @Override protected Response doInBackground(Void… empty) { HttpClient client = new DefaultHttpClient(); HttpPost post = new […]