Java 调用Calendar类函数会生成GC_并发消息

Java 调用Calendar类函数会生成GC_并发消息,java,android,calendar,garbage-collection,Java,Android,Calendar,Garbage Collection,我正在为Android编写一个小日历应用程序,我需要calendar类包含的一些函数(例如:计算月的第一天、月的当前一天、下个月的第几天、特定Unix时间戳的年份等等) 这些函数经常被调用,它们经常触发GC_并发,这会导致我的应用程序延迟 这是我访问日历功能的方式: private static Calendar cal; public static int getDayOfMonth(long sec) { if (cal == null) cal = Calenda

我正在为Android编写一个小日历应用程序,我需要
calendar
类包含的一些函数(例如:计算月的第一天、月的当前一天、下个月的第几天、特定Unix时间戳的年份等等)

这些函数经常被调用,它们经常触发GC_并发,这会导致我的应用程序延迟

这是我访问日历功能的方式:

private static Calendar cal;

public static int getDayOfMonth(long sec) {
    if (cal == null)
        cal = Calendar.getInstance(TimeZone.getDefault());

    //cal.clear();
    cal.setTimeInMillis(sec * 1000L);
    return cal.get(Calendar.DAY_OF_MONTH);
}

有没有更好的方法来访问函数而不产生这么多垃圾,或者有更好的方法来计算我需要的东西?

第一个问题:你分析过代码了吗?你有多确定这就是问题所在?如果你已经分析了并且你确定了


你试过使用或吗

一般来说,Java对日期和时间的默认支持非常糟糕

通过执行以下操作,可以使用Joda time执行相同的代码:

public static int getDayOfMonth(long sec) {
  DateTime time = new DateTime(sec * 1000L);
  return time.getDayOfMonth();
}

你不能停止垃圾收集,它是一个守护进程线程

这是为了提高性能;如果它使您的程序变慢,那么很可能是对象使用效率低下/其他设计缺陷导致垃圾收集器有冗余任务

我不想重复你可能已经知道的内容,但你应该看看@这篇文章,它应该证明是有用的


-Eric

旁注:如果您想确保“单例”方法正确运行,我认为您的
getDayOfMonth()
应该同步。@Jägermeister实际上我认为他应该使用
ThreadLocal
over
synchronized
,但是是的。我没有听说过Joda Time,我会找一找,谢谢!如果执行数百次,您的代码示例不也会产生大量垃圾吗?Java 1.7及更高版本非常擅长在不执行完整GC的情况下处理这样的短期对象。关于这个问题有很多文章