Tag: 垃圾收集

在Java中销毁对象

我对垃圾收集器如何在Java中工作有一个大概的想法,但我推销对象的原因不是因为我关心释放内存,而是因为function。 我可以通过一个例子更好地解释: 说我正在制作一个涉及金钱的游戏。 当一个人从地上拿起一个Money对象时,我想调用该对象的addTo方法,该方法涉及向该人的钱包添加一个值。 public class Money { /** The value of this object. */ private final int value; // constructor public Money(double x) { this.value = x; } // Should be called when a Person picks up this object. public void addTo(Person bob) { bob.addToWallet(this.value); } // MAIN METHOD public static void main(String[] args) […]

JVM GC问题

在过去的几周里,我一直在为Glassfish服务器测试不同的JVM设置。 堆(以及其他)的主要设置是:-Xms512m,-Xmx512m,-XX:NewRatio = 2。 我尝试了不同的GC设置,但是在启动服务器几天后我仍然遇到长时间暂停的问题。 我发现以下情况: 1. -XX:+ UseParallelGC -XX:+ UseParallelOldGC – 每分钟都会发生次要GC,主要GC每18小时发生一次。 我对次要GC没有任何问题,但5天后主要GC出现问题。 起初主要的GC停顿持续约100-200ms,但最后一次停顿持续70秒。 2. -XX:+ UseConcMarkSweepGC -XX:+ UseParNewGC – 与上面几乎相同。 次要GC很好,但主要的GC(不完整)停顿时间很长。 我注意到GC(CMS Final Remark)阶段的高级卸载问题已经停止了世界阶段。 3. -XX:+ UseConcMarkSweepGC -XX:+ UseParNewGC和-XX:MaxGCPauseMillis = 5000。 我只测试了一天,因为第二个主要的GC最后(不完整)已经持续了大约20秒,所以我认为还有其他错误。 4. -XX:+ UseG1GC,-XX:MaxGCPauseMillis = 5000,-XX:+ UseStringDeduplication,不带-XX:NewRatio = 2选项 – 主要GC(未满)每12小时发生一次,我已经注意到了一些问题: 2015-05-31T18:25:25.145+0200: 83383.897: [GC concurrent-mark-start] 2015-05-31T18:25:35.563+0200: 83394.312: [GC concurrent-mark-end, 10.4145795 secs] 2015-05-31T18:25:35.563+0200: […]

finalize方法中的exception

可能重复: 方法最终确定和例外 当一个对象即将从内存中释放时,垃圾收集器会调用finalize()方法。 在finalize()方法中引发exception时会发生什么? GC会继续进行并释放内存,否则GC将暂停该对象的进程?

消息“在安全点期间合并的操作”的含义

Java应用程序使用以下标志运行:-XX:+ PrintSafepointStatistics,然后在标准输出控制台上生成以下行: 2安全点期间VM操作合并 有人在乎解释这是什么意思吗? 更一般地说 – 是否有一个Java参考手册在某处详细说明所有JVM标志,它们的使用,最重要的是,预期的输出,以及相关的解释?

如果对其字段有引用,是否会对元素进行垃圾回收?

即,在 class A { public String s; } 和 A a1 = new A(); a1.s = “bla”; A a2 = new A(); a2.s = a1.s; a1 = null; 是a1是垃圾收集还是对a1.s的引用允许它被收集(我宁愿做一个深层复制, a2.s = new String(a1.s) )? 非常感谢提前!

String.substring vs String .split

我有一个逗号分层字符串,当调用String.split(“,”)它返回一个大约60的数组大小。在特定用例中,我只需要获取将从数组返回的第二个值的值。 所以例如”Q,BAC,233,sdf,sdf,”我想要的只是第一个’,’之前和第二个’,’之前的字符串的值。 我对性能的问题是我最好使用子字符串或使用split方法解析它,然后获取数组中的第二个值? 任何输入将不胜感激。 这种方法每秒会被调用数百次,因此我理解有关性能和内存分配的最佳方法非常重要。 -Duncan

Android和Java:减少服务循环中的内存使用量

我有一个Android服务,每秒使用此线程更新通知(注释不是真正相关): thread = new Thread() { @Override public void run() { // Preparando la notificación de Swap NotificationCompat.Builder notificationSwap = new NotificationCompat.Builder(context) .setSmallIcon(android.R.drawable.ic_dialog_info) .setContentTitle(“Notificator:”); NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); int notificationSwapId = 1; // TODO: Asignar un ID que no sea “Magic number” while (!stop) { String swapInfo = null; try{ // TODO: free devuelve […]

PrintGCApplicationStoppedTime

我有JVM选项-XX:+ PrintGCApplicationStoppedTime打印真正的“GC停止世界时间”。 例: 应用程序线程停止的总时间:0.0018219秒 应用程序线程停止的总时间:0.0016542秒 应用程序线程停止的总时间:0.0015797秒 我需要通过java代码计算“GC停止世界”。 我该怎么做 ?

垃圾收集什么时候在java中工作?

我知道有很多关于java垃圾收集的文章但是在搜索之后我并不确切地知道“什么时候垃圾收集在java应用程序中运行?(当应用程序重启或者它仍在运行时)” 。

是否有可能使用常规JVM创建一个高优先级线程,一个不会被任何其他线程抢占的线程?

所以我的目标很简单:我想在不使用RTSJ(实时Java VM)或其他专有JVM的情况下在Java中创建高优先级线程。 让我们假设您从未创建任何垃圾,因此GC不会成为罪魁祸首。 我们假设我有4个处理器。 它可行吗? 如果没有,是否可以计算我的线程被抢占的次数? @Gray:我希望尽可能少的延迟实时响应,而不必去RTSJ和特殊操作系统 @sarnold:你是对的。 如果您在JVM级别中实现了这一点,但操作系统不会抢占您的JVM,则在较低级别会遇到相同的问题。 让我们假设有可能破解和/或使用调整不这样做的Linux发行版。 @StephenC:我已经知道它无法完成。 这就是我想要这样做的原因。 🙂 如果我至少可以检测到抢占,我将有办法衡量我的进步。