相关疑难解决方法(0)

是否支持在HotSpot JVM中删除压缩字符串?

在此页面甲骨文的Java HotSpot虚拟机的选项,它会列出-XX:+UseCompressedStrings作为默认选项和.但是在Java 6更新29中,默认情况下它处于关闭状态,并且在Java 7 update 2中它会报告警告

Java HotSpot(TM) 64-Bit Server VM warning: ignoring option UseCompressedStrings; support was removed in 7.0
Run Code Online (Sandbox Code Playgroud)

有谁知道删除此选项背后的想法?


在java中对巨大的file.txt进行排序

有了-mx2g这个例子,选项打开了4.541秒,在Java 6更新29中关闭了5.206秒.很难看出它会影响性能.

注意:Java 7更新2需要2.0 G,而没有压缩字符串的Java 6更新29需要1.8 GB,压缩字符串只需要1.0 GB.

java performance jvm java-7

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

如何使用字符串有效地管理内存?

考虑一段示例代码.

public void testString()
{     
    int i = 0;
    while(i < 100000000)
    {
        String s ="Hi hello bye" +i;
        i++;          
    }
}
Run Code Online (Sandbox Code Playgroud)

在每次迭代中,都会创建一个新的String,并且下一次迭代不再需要它的值.我尝试打印之前消耗的内存并发布此testString()功能.这是他们的价值观.

Before invoking testString():

Total Memory: 91684864 (87.4375 MB)
Max Memory:   1360855040 (1297.8125 MB)
Free Memory:  72163552 (68.82052612304688 MB)

After invoking testString():
Total Memory: 424280064 (404.625 MB)
Max Memory:   1360855040 (1297.8125 MB)
Free Memory:  171766816 (163.80960083007812 MB).
Run Code Online (Sandbox Code Playgroud)

我看到使用了大量内存,并且由于当前处理字符串的方式,我担心JVM堆可能会超出范围.在迭代2中不再需要为迭代1生成的字符串,并且可以释放其存储空间.我相信这不会发生在这里.

我尝试使用StringBuffer和StringBuilder对象,内存使用情况似乎有很小的改善.

请帮助我更好,更好的方法.

java string performance jvm memory-leaks

24
推荐指数
2
解决办法
2335
查看次数

字符串文字使用2倍的预期永久生成空间量

这是Sun JDK 1.6u21,x64.

我有一个类用于试验perm gen用法,它只包含一个大字符串(512k字符):

public class Big0 {
     public String bigString =
         "A string with 2^19 characters, should be 1 MB in size";
}
Run Code Online (Sandbox Code Playgroud)

我检查使用烫发根的使用getUsage().toString()MemoryPoolMXBean为永久生成(在21岁以下称为"PS烫发根"对象,尽管它有不同的版本,或者与不同的垃圾收集器略有不同的名称.

当我第一次引用类时,通过读取来说Big0.class,perm gen跳过~500 KB - 这就是我所期望的,因为字符串的常量池编码是UTF-8,而我只使用ASCII字符.

然而,当我实际创建这个类的实例时,perm gen会跳跃大约2 MB.由于这是1 MB内存中的字符串(每个UTF16字符2个字节,当然没有代理),我很困惑为什么内存使用量是双倍的.

如果我将字符串设为静态,则会产生相同的效果.如果我用最后的,它不能作为编译我超过65535个字节常量池项的上限(不知道为什么最后留下关闭避免了要么 - 认为这是一个加分题).

有任何见解赞赏!

编辑:我还应该指出,这发生在非静态,最终的非静态和静态字符串中,但不适用于最终的静态字符串.由于这已经是字符串常量的最佳实践,也许这主要是学术兴趣.

java memory string jvm permgen

5
推荐指数
1
解决办法
555
查看次数

将一个短字放入2个字节的字符串中

因此,我正在为在线游戏制作自己的网络协议,为了节省空间,每条消息(通过TCP发送)都被赋予一个短的2字节ID,从服务器发送到客户端的所有消息,反之亦然是字符串,如何只用2个字节(字符)将java中的short转换为字符串?

更新:我可能不清楚我想要什么...我希望能够将一个短的int转换为2个字符,这样我就可以通过网络以短字节格式发送短消息,只需2个字节.将其解码回另一侧的短片(在动作3中).

一个角色可以容纳256个可能的值吗?所以256*256 = 65,536这是无符号短整数的大小!

这是我到目前为止所得到的:

public static String toCode(int c){

    if(c <= 255 ){
        return Character.toString((char)c);
    }else{
        return null;
    }
}

public static int fromCode(String c){
    return ((int)c.charAt(0));//Return the character code of the send string, 1 char only
}
Run Code Online (Sandbox Code Playgroud)

这可以将一个int变成一个可以通过网络发送的单个字符,现在我只需要让它使用2个字符就可以做到最短.

java string byte short actionscript-3

3
推荐指数
1
解决办法
930
查看次数

存储在HashMap中的重复值

我有一个字典作为从2M单词到50k单词的文本文件映射.我将此文件加载到内存中HashMap<String, String>,方法是逐行读取文件,在分隔符上拆分并调用myMap.put(line[0], line[1]).文本文件的大小是45MB,而HashMap使用350MB堆.我的目标是在不损害查找速度的情况下减少内存使用. myMap.values().size()返回2M而不是50k,建议将值存储为重复值.有没有办法让相同的值指向同一个String对象?

Map<String, String> dict = new HashMap<>();
try (FileReader fr = new FileReader(FILE);
        BufferedReader br = new BufferedReader(fr)) {
    String line;
    while ((line = br.readLine()) != null) {
        String key_value[] = line.split(":");
        dict.put(key_value[0], key_value[1].intern());
    }
} catch (Exception e) {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

java hashmap

1
推荐指数
1
解决办法
1376
查看次数

获得更好的性能附加字符串比通过标准Java stringbuilder.append

作为填充搜索引擎的过程的一部分,我也填充了Berekely-DB值存储.每晚重复此过程,此时每晚总运行时间的+/- 60%是由创建要插入值存储的值引起的(因此不包括实际插入Berekely-DB的时间和导致的时间由Berekely客户提供

这些值是通过为每个键分配一个stringbuilder创建的,并且平均将大约1000个字符串附加到这样的stringbuilder.结果值平均约为10k.我想知道这是否可以更有效地完成,因为: - (平均而言)附加到每个Stringbuilders的1000个字符串具有固定长度:即:每个String具有相同的长度并且该长度在前面已知) - 所有字符串被附加到末尾.

例如,为char []或characterStream/writer交换stringbuilder会更高效吗?这样我就可以在char []中保留并索引写入的位置.

谢谢,Geert-Jan

java performance stringbuilder

0
推荐指数
1
解决办法
1342
查看次数