我是Java新手,对Java中的垃圾收集器感到困惑.它实际上做了什么以及什么时候开始行动.请描述Java中垃圾收集器的一些属性.
考虑下面的C#程序,我在codegolf上提交它作为创建循环而没有循环的答案:
class P{
static int x=0;
~P(){
System.Console.WriteLine(++x);
new P();
}
static void Main(){
new P();
}
}
Run Code Online (Sandbox Code Playgroud)
在我的检查中,这个程序看起来像一个无限循环,但似乎运行了几千次迭代,然后程序成功终止而没有错误(没有抛出错误).P最终的终结者不会被称为规范违规吗?
显然这是一个愚蠢的代码,应该永远不会出现,但我很好奇该程序如何完成.
原始代码高尔夫邮件:: https://codegolf.stackexchange.com/questions/33196/loop-without-looping/33218#33218
所以我在远程盒子上看着一个带有jmap的堆,我想强制垃圾收集.如果不突然进入jvisualvm或jconsole和朋友,你怎么做?
我知道你不应该在强制垃圾收集的实践中 - 你应该弄清楚为什么堆很大/正在增长.
我也意识到System.GC()实际上并没有强制进行垃圾收集 - 它只是告诉GC你希望它发生.
话虽如此,有办法轻松做到这一点吗?我失踪了一些命令行应用程序?
我读过有关Generations和Large object heap的内容.但我仍然不明白拥有大型对象堆的意义(或好处)是什么?
如果CLR只是依赖于第2代(考虑到Gen0和Gen1的阈值很小来处理大型对象)来存储大型对象,那么可能出现什么问题(在性能或内存方面)?
我已经将java配置为将垃圾收集信息转储到日志中(详细GC).我不确定日志中的垃圾收集条目是什么意思.这些条目的样本发布在下面.我在Google上搜索过,并没有找到可靠的解释.
我有一些合理的猜测,但我正在寻找答案,这些答案提供了条目中数字的严格定义,并由可靠的消息来源支持.对所有引用sun文档的答案自动+1.我的问题是:
8109.128:[GC [PSYoungGen:109884K-> 14201K(139904K)] 691015K-> 595332K(1119040K),0.0454530秒]
8112.111:[GC [PSYoungGen:126649K-> 15528K(142336K)] 707780K-> 605892K(1121472K),0.0934560 secs]
8112.802:[GC [PSYoungGen:130344K-> 3732K(118592K)] 720708K-> 607895K(1097728K),0.0682690 secs]
可能重复:
弱引用 - 它们有用吗?
由于垃圾收集器可以随时声明弱引用,是否有任何实际的理由使用它们?
JVM用于抛出'java.lang.OutOfMemoryError:超出GC开销限制'的采样时间是多少?我知道你可以用参数GCTimeLimit和GCHeapFreeLimit来控制98%和2%,但是采样时间是多少?
由于Java 7将默认使用新的G1垃圾收集,Java是否能够处理一个数量级更大的堆而不会产生"破坏性"的GC暂停时间?有人在生产中实际实施了G1,你的经历是什么?
公平地说,我唯一一次看到非常长的GC暂停是非常大的堆,远远超过工作站.澄清我的问题; G1将打开数百GB的网关?TB?
我有一个相当复杂的Javascript应用程序,它有一个主循环,每秒调用60次.似乎有很多垃圾收集正在进行(基于Chrome开发工具中内存时间线的'锯齿'输出) - 这通常会影响应用程序的性能.
因此,我正在尝试研究减少垃圾收集器必须完成的工作量的最佳实践.(我在网上找到的大部分信息都是为了避免内存泄漏,这是一个稍微不同的问题 - 我的内存被释放,只是垃圾收集过多了.)我假设这主要归结为尽可能重用对象,但当然魔鬼在细节中.
该应用程序按照John Resig的简单JavaScript继承的方式构建在"类"中.
我认为一个问题是一些函数可以每秒调用数千次(因为它们在主循环的每次迭代中使用了数百次),也许这些函数中的本地工作变量(字符串,数组等)可能是问题.
我知道更大/更重的对象的对象池(我们在一定程度上使用它),但我正在寻找可以全面应用的技术,特别是涉及在紧密循环中被调用很多次的函数.
我可以使用哪些技术来减少垃圾收集器必须执行的工作量?
而且,也许还有 - 可以使用哪些技术来识别哪些对象被垃圾收集最多?(这是一个非常大的代码库,所以比较堆的快照并不是很有成效)
给定一个仅在程序设置中使用的假设实用程序类:
class MyUtils {
private static MyObject myObject = new MyObject();
/*package*/static boolean doStuff(Params... params) {
// do stuff with myObject and params...
}
}
Run Code Online (Sandbox Code Playgroud)
当myObject不再被使用时,它会被垃圾收集,还是会在程序的生命周期中保留?