Tag: 垃圾收集

Java:为什么不收集垃圾?

关于GCing理论的快速问题。 我有以下方法。 它运行,并退出该方法。 为什么即使在GC运行后,计时器仍然存在并保持“TICK”? 我不相信在这种方法存在之后仍然存在对定时器或时间任务的引用,所以我希望定时器被GCed并导致exception。 请帮我理解这个概念。 谢谢,jbu private void startTimer() { Timer timer= new Timer(); TimerTask timerTask= new TimerTask() { @Override public void run() { System.out.println(“TICK”); } }; timer.scheduleAtFixedRate(timerTask, 0, 500); }

为什么在Java中创建MAX_INT大小的数组是不可能的?

我已经阅读了这个问题的一些答案( 为什么我不能创建一个大尺寸的数组?和https://bugs.openjdk.java.net/browse/JDK-8029587 ),我不明白以下内容。 “在GC代码中,我们将单词中对象的大小作为int传递。” 据我所知,JVM中单词的大小是4个字节。 根据这一点,如果我们将大字长数组(例如,MAX_INT – 5)的大小作为int传递,我们必须得到OutOfMemoryException, 请求的数组大小超过VM限制,因为大小对于int来说太大了没有标题的大小。 那么为什么不同类型的数组对元素的最大数量有相同的限制?

为什么这个Java方法泄漏 – 为什么内联它修复了泄漏?

我编写了一个最小的有点惰性( int )序列类GarbageTest.java ,作为一个实验,看看我是否可以在Clojure中处理Java中非常长的懒惰序列。 给定一个返回懒惰,无限,自然数序列的naturals()方法; drop(n,sequence)方法,它删除drop(n,sequence)的前n元素并返回sequence的其余部分; 和一个简单返回的nth(n,sequence)方法: drop(n, lazySeq).head() ,我写了两个测试: static int N = (int)1e6; // succeeds @ N = (int)1e8 with java -Xmx10m @Test public void dropTest() { assertThat( drop(N, naturals()).head(), is(N+1)); } // fails with OutOfMemoryError @ N = (int)1e6 with java -Xmx10m @Test public void nthTest() { assertThat( nth(N, naturals()), is(N+1)); } […]

为什么垃圾收集器没有比单个数字堆空闲%更快地进行更积极的垃圾收集?

这些是WebLogic 11g中的Sun Hotspot 1.6 JVM堆设置: -Xms10g -Xmx10g -XX:MaxPermSize=256m -XX:+UseParNewGC -XX:ParallelGCThreads=2 -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:ConcGCThreads=2 我在JVM堆免费%图表中看到的24小时基本上是无堆的%以较慢的速度下降,直到我们达到约9%(大约需要24小时)。 然后系统运行看起来像一个完整的gc并回到97%。 是否有一些我应该添加/修改的设置会告诉JVM比我们低于10%的堆免费更快地完成这个完整的GC? 例如一些比例设定? 它不会导致等待我们获得9%免费的问题,但它会使监控/警报变得更加困难。 理想情况下,我们希望始终保持高于30%的免费使用率,这样如果我们下降到那些单位数字,我们就知道存在某种问题,例如内存泄漏。

JVM JIT诊断工具和优化技巧

我听到很多关于JVM JIT 可以做什么,但是没有看到很多关于如何分析JIT在程序的给定运行中实际执行的操作的信息。 有很多关于使用-XX:+PrintCompilation和-XX:+PrintOptoAssembly但它会导致很难解释的真正低级别的信息。 一般来说,在优化期间,我喜欢使用具有专用JIT预热时间等的常用操作的基准套件,但我希望能够看到哪些优化实际上触发了我的代码。 也许我的JVM考虑内联一个特定的方法调用,但它的一些东西使它决定不,或者JIT无法避免我的循环中的数组边界检查,因为我的措辞我的不变量和循环条件太模糊。 我希望像YourKit这样的工具能够支持某些forms的“JIT正在发生的事情”,但我无法在YourKit或其他任何地方找到支持。 理想情况下,我只是喜欢在我的程序运行期间JIT优化器正在思考的大脑转储。 假设我已经充分预热了我的function,它决定将三个方法内联到我的内循环中并将循环分成三个部分,中间部分没有数组边界检查,我想要总结这些决定和动机对他们来说 我错过了一些明显的东西吗? JVM性能感知程序员在优化紧密内循环以确定正在发生的事情时会做些什么? 当然,低级-XX标志不是唯一的选择,可以吗? 我很欣赏有关如何最好地处理JVM上的这种低级内容的提示。 不,这个问题不是因为过早优化而产生的! 🙂 编辑:我想我想要的一些东西是由-XX:+LogCompilation给出的,但是如果人们有这种活动的一般提示和工具,我仍然很好奇。

Java Garbage Collect是否总是要“停止世界”?

我想更深入地了解Java的垃圾收集。 在HotSpot JVM世代集合中,在堆中,有三个区域(Young generation,Old generation和permanent generation)。 此外,还有两种算法: 1) Mark Sweep Compact 。 2) 并发标记和扫描 。 GC是否需要“停止世界”取决于它使用的算法而不是它运行的是哪一代,这是真的吗? 换句话说,如果我在所有三个区域使用1)作为GC算法,STW将永远发生? 此外,我理解不同的是第二个GC算法不需要压缩,最终会导致碎片。 那么第二个问题就是为什么压缩需要STW暂停?

Java GC:推广的顶级对象类(按大小)?

在每次年轻的GC活动结束后,请让我知道确定促进老一代年轻一代记忆构成的最佳方法是什么? 理想情况下,我想知道负责的class级名称,每个“年轻一代 – >老一代”推广块的80%的堆; 例如:我有600M年轻人,每个任期晋升6M; 我想知道哪些对象构成了这个6M。 谢谢。

我们可以明确地调用垃圾收集器吗?

我的应用程序有很多迭代。 直到现在我还没有遇到任何内存问题。 但是从代码级别我可以怀疑很少有地方会导致内存泄漏和内存不足问题。 我正在考虑手动调用垃圾收集器。 手动调用垃圾收集器是一种好习惯吗?

如何识别JNI全局引用内存泄漏的原因?

我正在使用Tomcat,在停止我的Web应用程序之后,仍然会引用我的Web应用程序的类加载器实例。 结果是不会释放大量的内存(主要与静态数据相关)。 迟早会导致OutOfMemoryError 。 我进行了heap dump ,我意识到它由JNI全局引用保存 , 可以防止类加载器被垃圾回收 。 我的应用程序不使用JNI 。 我也没有使用Apache Tomcat Native Library 。 我正在使用Sun / Oracle JDK。 我想跟踪这个全球参考的原因/来源。 (我的猜测是JVM内部引用了类加载器 – 但是为什么/在哪里?)。 题: 有哪些方法/工具集可以实现这一目标? UPDATE 似乎bestsss是正确的,jvm调试模式引入了JNI全局引用。 这帮助了我,但它没有回答这个问题所以我仍然很想回答一个可能对将来有帮助的问题。

我们可以关闭终结器吗?

由于几乎没有什么保证关于什么时候,甚至终结器运行和终结器现在几乎被认为是气味 – 有没有办法说服JVM完全跳过所有的终结过程? 我问,因为我们有一个庞大的应用程序,当移动到一个较新的JVM(不确定在这个阶段)是什么看起来非常像终结者的已知问题(抛出exception,因此非常慢的GC) 。 添加 有关Java内存泄漏故障排除的讨论:终结? 建议在终结器中抛出exception时出现主要问题,因为这会大大减慢终结过程。 当内存变低并且堆转储的分析显示大量的Finalizer对象(超过10,000,000)时,我的问题显示为急剧减速 – 向我表明减速可能是他们的错,因为他们正在推迟GC。 显然我可能是错的。 我没有权力要求重构。