后来的许多实验中,我发现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哈希图的创建都会导致应用程序停止可伸缩性(我夸大了但不多)。我的应用程序确实大量使用了哈希图,所以我想我要么重写哈希图,要么重写应用程序。
我在提出一个单独的问题,以查看如何处理。
谢谢你的帮助