Tag: 垃圾收集

如何从JVM中检测长gc?

如何检测超过某个已配置应用程序超时的GC( 编辑或任何停顿),以便我可以记录警告(或动态延长超时)? 编辑我不是要求监视等替代方法或变通办法。 我正在写一个库,我无法控制环境或设置。 虽然我将清楚地记录库的用户必须设置适当的超时,但我仍然希望人们忽略其他人在几年后更改jvm堆设置并忘记增加超时。 如果我可以在库中记录可能超过配置的超时的暂停,则支持会更简单。 它不一定是完美的检测“足够好”会减少库用户浪费时间而不设置合理的超时。 编辑并清楚即使有一个大的GC,库也能正常工作,但是有充分的理由选择一个好的超时来检测崩溃,以便库试图连接到备用对等体。

HashMap和垃圾收集:我需要在变量重新赋值之前调用clear()吗?

也许这是一个愚蠢的问题,但我不确定垃圾收集过程。 考虑以下代码: private HashMap configuration = new HashMap(); … //add some items to configuration … //now get another configuration HashMap parameters = new HashMap(); for (String parameterName : configurationParameterNameList) { parameters.put(parameterName, reader.readParameter(parameterName)); } //and reassign the variable this.configuration.clear(); this.configuration = parameters; 在重新分配之前,我是否需要调用configuration.clear() ? Parameter类里面只包含几个String变量。

从Java5迁移到6后GC行为的变化

我们最近将我们的系统从Sun Java 5迁移到Java6服务器VM(特别是Linux 32位上的1.6.0_16)。 我们已经注意到垃圾收集行为已经发生变化,从而触发了我们的堆警告监控系统。 堆使用情况图表显示了比我们在Java5中看到的更“尖峰”的内存使用情况,在运行大型GC之前,VM允许堆使用率非常高。 它似乎不是应用系统本身的问题(它实际上从来没有用完内存),但是当使用峰值接近阈值时,它会给监控系统偶尔发出虚假的“发火”信号。 我们可以增加堆最大值并希望峰值不会变得更大,但我更愿意找出是否有一种方法可以调整JVM参数,使得我们获得更平滑的配置文件,即使我们松散一点性能。 我猜我们可以设置一些-XX选项来实现这个目标,但我在文档中看不到任何这样的东西。 有人知道这样的选择吗?

我们可以在java中定制垃圾收集器吗?

我们知道java的垃圾收集器是一个低优先级的线程。 在java中,我们可以创建任何具有高优先级的线程。 因此可以拥有我们自己的具有可变优先级的自定义垃圾收集器线程(我们可以根据内存管理级别进行设置)。 有人试过吗 如果是,你可以分享一些关于如何及其逻辑的知识吗? 谢谢

计算对象的“权重”,如何

可能重复: 在Java中,确定对象大小的最佳方法是什么? 假设您有一个数据结构,允许您向其添加数据,比如一个列表: List 由于系统的客户端实际上添加了内容…在某些时候,JVM将耗尽内存,这只是一个问题,何时会发生这种情况。 定期将包含此列表的对象保存到磁盘并将其余部分保存为gc会很好。 使用Java,是否可以估计对象现在占用多少内存?

如何查找哪些对象创建的垃圾最多

我有一个应用程序,包含80个不同类的大约80个实例。 由于我的应用程序是实时的,因此这些类的某些子集生成的垃圾量是不可接受的并且停止世界暂停太长时间。 我想要找到的是哪些类负责在堆上创建最大数量的对象(不是聚合大小,而是原始对象数),因为这是导致世界暂停停留这么长时间的原因。 我怎么发现这个? 如果需要JVisualVM,我就有这个。

每小时一次玻璃鱼全gc

我在Glassfish应用程序中每小时看到一个完整的GC。 从GC日志中提取: 9.210: [Full GC 28311K->27979K(6422528K), 0.3770238 secs] … 3609.647: [Full GC 1186957K->597880K(6478208K), 4.5102977 secs] … 7214.192: [Full GC 742184K->595596K(6469504K), 4.3726625 secs] … 10818.805: [Full GC 756228K->570803K(6455936K), 4.8630472 secs] 只要Glassfish启动,这种模式就会大致重复。 其间的“……”是增量GC。 时间似乎非常可疑 – 为什么我们会在一小时左右看到完整的GC? JVM启动参数: -Xms6400m -Xmx6400m -XX:NewSize=1024m -XX:MaxNewSize=1024m -XX:PermSize=256m -XX:MaxPermSize=1024m -XX:+UseParallelGC -XX:+UseParallelOldGC -Xloggc:C:\glassfish3\glassfish\domains\domain1\logs\gc\gc.log -XX:+AggressiveOpts -Xss1024k -XX:+CMSClassUnloadingEnabled 根据JVisualVM,我们没有接近耗尽堆空间的地方。 Glassfish 3.1.2.2,Oracle JDK 1.6.0_45,Windows Server 2008

使用Mule3.2在重载下GC过频

在Mule 3.2(100个线程同时发送请求)的重负载下,通过jprofiler,我可以看到创建了大量的对象实例(每秒大约500mb),并且占用了堆的年轻区域的90%以上的空间,这导致了jvm每2秒触发一次gc。 为什么? 这是正常的吗? 或者它是一个错误 jvm参数: -Xms = 2048m -Xmx = 2048m -Xmn = 768m -XX:PermSize = 256m -XX:MaxPermSize = 512m -Xss256k -XX:+ UseConcMarkSweepGC 谢谢

java中的资源是什么?为什么我们必须在使用后关闭它?

在java中“resource”这个词是什么意思? 为什么我们必须在使用后关闭它,即使垃圾收集器在jvm中运行? 为什么我们必须在finally块中编写资源清理代码?

如何在java中垃圾收集String对象?

正如我们所知,我们何时创建String对象,如String value = new String(“ABC”); 然后将创建新的String对象,当我们再次使用value变量作为value=”xyz”将创建一个新的String对象。 所以我的问题是,之前创建的String对象将在哪一点被垃圾收集?