后来的许多实验中,我发现JVM没什么作用,但我也发现了JDump的强大功能。64个线程中的50个位于以下行。
java.lang.Thread.State: RUNNABLE at java.util.Random.next(Random.java:189) at java.util.Random.nextInt(Random.java:239) at sun.misc.Hashing.randomHashSeed(Hashing.java:254) at java.util.HashMap.<init>(HashMap.java:255) at java.util.HashMap.<init>(HashMap.java:297)
Random.next看起来像这样
protected int next(int bits) { long oldseed, nextseed; AtomicLong seed = this.seed; do { oldseed = seed.get(); nextseed = (oldseed * multiplier + addend) & mask; } while (!seed.compareAndSet(oldseed, nextseed)); return (int)(nextseed >>> (48 - bits)); }
最有趣的是,这并不是一个明显的锁,因此我用来发现互斥锁的工具无法正常工作。
因此,似乎任何Java哈希图的创建都会导致应用程序停止可伸缩性(我夸大了但不多)。我的应用程序确实大量使用了哈希图,所以我想我要么重写哈希图,要么重写应用程序。
我在提出一个单独的问题,以查看如何处理。
谢谢你的帮助
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)