小编PNS*_*PNS的帖子

java.lang.OutOfMemoryError:超出了GC开销限制

我在一个程序中得到这个错误,该程序创建了几个(几十万个)HashMap对象,每个对象有几个(15-20)个文本条目.在提交到数据库之前,必须收集这些字符串(不会分解成较小的数量).

根据Sun的说法,如果在垃圾收集中花费了太多时间,则会发生错误:如果超过98%的总时间花在垃圾收集上,并且不到2%的堆被恢复,则会抛出OutOfMemoryError. ".

显然,可以使用命令行将参数传递给JVM

  • 通过"-Xmx1024m"(或更多)增加堆大小,或
  • 通过"-XX:-UseGCOverheadLimit"完全禁用错误检查.

第一种方法工作正常,第二种方法在另一个java.lang.OutOfMemoryError中结束,这次是关于堆的.

所以,问题:对于特定的用例(即几个小的HashMap对象),是否有任何编程替代方案?例如,如果我使用HashMap clear()方法,问题就会消失,但HashMap中存储的数据也会消失!:-)

StackOverflow中的相关主题也讨论了该问题.

java heap heap-memory hashmap g1gc

317
推荐指数
10
解决办法
59万
查看次数

在GitHub中编辑git commit消息

提交GitHub.com后,是否有任何在线编辑提交消息的方法?

从命令行,人们可以做到

git commit --amend -m "New commit message"
Run Code Online (Sandbox Code Playgroud)

正如另一个问题中的正确建议.

尝试git pull然后git push工作(没有任何其他提交在平均时间干扰).

但它可以通过GitHub网站完成吗?

git commit github post-commit

152
推荐指数
4
解决办法
12万
查看次数

尽管设置为1.7,但IntelliJ IDEA 13使用Java 1.5

尽管在所有项目设置(包括in File -> Project Structure -> Project :: Project SDK)中都指定了JDK 1.7 ,但IntelliJ 13在尝试编译一些使用菱形运算符的简单Java 7代码时会产生以下错误:

java: diamond operator is not supported in -source 1.5
(use -source 7 or higher to enable diamond operator)
Run Code Online (Sandbox Code Playgroud)

配置中是否还有其他位置-source 7应启用预期选项?

java compilation intellij-idea

142
推荐指数
6
解决办法
9万
查看次数

GitHub - 按作者列出提交

GitHub上是否有任何方法可以在浏览器中列出由单个作者提交的所有提交(既不是本地提交git log,也不是通过API,也不是通过API)?

单击提交列表中的用户名(提交历史记录)只会导致该用户的配置文件页面.检查GitHub UI和搜索(Google,StackOverflow)并未揭示执行此操作的方法.

git github

128
推荐指数
3
解决办法
8万
查看次数

Java if try/catch开销

Java中是否存在使用try/catch块的开销,而不是if块(假设所附的代码没有请求)?

例如,对字符串采用以下两种简单的"安全修剪"方法:

public String tryTrim(String raw) {
    try {
        return raw.trim();
    } catch (Exception e) {
    }
    return null;
}

public String ifTrim(String raw) {
    if (raw == null) {
        return null;
    }
    return raw.trim();
}
Run Code Online (Sandbox Code Playgroud)

如果raw输入很少null,两种方法之间是否有任何性能差异

此外,使用该方法简化代码布局是一种很好的编程模式tryTrim(),特别是当通过将代码封装在一个try/catch块中可以避免许多if块检查稀有错误条件时?

例如,一个常见的情况是使用一个方法N parameters,M <= N在其开始附近使用它们,如果任何这样的参数是"无效的"(例如,空或空字符串),则快速且确定地失败,而不影响其余的码.

在这种情况下,不必编写k * M if块(其中k每个参数的平均检查次数,例如k = 2对于null或空字符串),try/catch块将显着缩短代码并且可以使用1-2行注释明确地注意到"非常规"逻辑.

这样的模式也会加速该方法,特别是如果错误条件很少发生,并且它会这样做而不会影响程序安全性(假设错误条件是"正常"的,例如在字符串处理方法中为null或空值)是可以接受的,虽然很少存在).

java if-statement exception-handling try-catch overhead

55
推荐指数
4
解决办法
4万
查看次数

字符串与Java枚举的不区分大小写匹配

JavavalueOf()为每个Enum<T>对象提供了一个方法,所以给出了enum类似的方法

public enum Day {
  Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
}
Run Code Online (Sandbox Code Playgroud)

一个人可以像查找一样

Day day = Day.valueOf("Monday");
Run Code Online (Sandbox Code Playgroud)

如果传递给的字符串valueOf()与现有Day值不匹配(区分大小写),IllegalArgumentException则抛出a.

要进行不区分大小写的匹配,可以在Day枚举中编写自定义方法,例如

public static Day lookup(String day) {
  for (Day d : Day.values()) {
    if (d.name().equalsIgnoreCase(day)) {
      return type;
    }
  }
  return null;
}
Run Code Online (Sandbox Code Playgroud)

是否有任何通用的方法,在不使用值或任何其他额外对象的缓存的情况下,只编写一次lookup()上面的静态方法(即,不是每个enum),假定该values()方法Enum<E>在编译时被隐式添加到类中?

这种"通用" lookup()方法的签名与该方法类似Enum.valueOf(),即:

public static <T extends Enum<T>> T lookup(Class<T> enumType, String name); …
Run Code Online (Sandbox Code Playgroud)

java generics enums

41
推荐指数
6
解决办法
4万
查看次数

W3C XML的Java SimpleDateFormat模式带有时区

我试图解析W3C XML Schema日期,如下所示

"2012-05-15T07:08:09+03:00"
Run Code Online (Sandbox Code Playgroud)

它符合W3C XML Schema dateTime规范的ISO 8601版本.

在上述日期中,时区标识符是"+03:00",但SimpleDateFormat显然不存在表示它的模式.

如果时区是"+0300",那么Z(大写)将是适用的并且SimpleDateFormat模式将是

yyyy-MM-dd'T'HH:mm:ssZ
Run Code Online (Sandbox Code Playgroud)

类似地,如果时区是"GMT+03:00",那么z(小写)将是适用的并且SimpleDateFormat模式将是

yyyy-MM-dd'T'HH:mm:ssz
Run Code Online (Sandbox Code Playgroud)

('Z'顺便说一句,大写也适用).

那么,是否有一种SimpleDateFormat模式或解决方法来表示上述日期而无需预处理日期字符串?

java date iso8601 simpledateformat

30
推荐指数
3
解决办法
4万
查看次数

Java循环效率("for"与"foreach")

(对于那些熟悉JVM编译和优化技巧的人来说一个问题...... :-)

是否有任何"for"和"foreach"模式明显优于其他模式?

考虑以下两个例子:

public void forLoop(String[] text)
{
    if (text != null)
    {
        for (int i=0; i<text.length; i++)
        {
            // Do something with text[i]
        }
    }
}

public void foreachLoop(String[] text)
{
    if (text != null)
    {
        for (String s : text)
        {
            // Do something with s, exactly as with text[i]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

forLoop快还是慢foreachLoop

假设在这两种情况下text阵列都不需要进行任何健全性检查,是否有明显的赢家或仍然太接近无法拨打电话?

编辑:正如在一些答案中所指出的,对于数组,性能应该是相同的,而对于像List这样的抽象数据类型,"foreach"模式可能略微更好.另请参阅讨论该主题的答案.

java performance foreach for-loop

28
推荐指数
2
解决办法
4万
查看次数

在Windows关闭时执行批处理脚本

有没有办法在Windows 7 Professional用户点击"关闭"时运行批处理脚本(例如.BAT文件)(不是计划关闭机器的批处理文件,只有在用户点击时才运行的批处理文件) "关掉")?

理想情况下,此类脚本将显示命令提示符窗口并提供取消关闭过程的选项.

不需要第三方实用程序的解决方案更可取.

windows shutdown batch-file group-policy windows-7

28
推荐指数
2
解决办法
9万
查看次数

转义Java正则表达式中的特殊字符

在Java或任何开源库中是否有任何方法可以转义(不引用)特殊字符(元字符),以便将其用作正则表达式?

这在动态构建正则表达式时非常方便,无需手动转义每个单独的字符.

例如,考虑一个简单的正则表达式\d+\.\d+,它匹配带小数点的数字1.2,以及以下代码:

String digit = "d";
String point = ".";
String regex1 = "\\d+\\.\\d+";
String regex2 = Pattern.quote(digit + "+" + point + digit + "+");

Pattern numbers1 = Pattern.compile(regex1);
Pattern numbers2 = Pattern.compile(regex2);

System.out.println("Regex 1: " + regex1);

if (numbers1.matcher("1.2").matches()) {
    System.out.println("\tMatch");
} else {
    System.out.println("\tNo match");
}

System.out.println("Regex 2: " + regex2);

if (numbers2.matcher("1.2").matches()) {
    System.out.println("\tMatch");
} else {
    System.out.println("\tNo match");
}
Run Code Online (Sandbox Code Playgroud)

毫不奇怪,上面代码产生的输出是:

Regex 1: \d+\.\d+
    Match
Regex 2: \Qd+.d+\E
    No match
Run Code Online (Sandbox Code Playgroud)

也就是说, …

java regex escaping

23
推荐指数
4
解决办法
10万
查看次数