小编mal*_*mut的帖子

什么原因导致Java中的长旋转和同步时间?

在Java 8 Update 45中,将这些选项添加到java调用中:

-XX:+PrintGCApplicationStoppedTime
-XX:+PrintSafepointStatistics
-XX:PrintSafepointStatisticsCount=1
Run Code Online (Sandbox Code Playgroud)

向我显示这些统计数据:

vmop [threads: total initially_running wait_to_block] [time: spin block sync cleanup vmop] page_trap_count
3679.229: no vm operation [ 72 1 2 ] [ 6016 0 6016 0 0 ]  1
2015-05-22T11:25:27.519+0200: Total time for which application threads were stopped: 6.0168551 seconds, Stopping threads took: 6.0164099 seconds
Run Code Online (Sandbox Code Playgroud)

这里的问题是时间长了Stopping threads.在这个例子中,它是6秒,这已经是我们的应用程序的一个问题,但我已经看到更大的时间,在一个实例(没有完整的日志记录,但)相当于几乎一分钟.

VM操作(此处no vm operation:)是变化的.我也看到了,例如RevokeBias,G1IncCollectionPause或GCG_Operation.而且,page_trap_count似乎无关紧要.我所看到的例子,其中是0,和其他人在那里为2一致,不过,是时候总是体现在价值观spin和sync.

我寻找那些定时值的深入的解释spin和sync …

java garbage-collection g1gc

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

使用G1 GC和trove库的JVM崩溃

我们遇到以下问题:在我们的某些 Linux机器上,使用特洛伊库和G1 GC的Java应用程序将使用以下类型的消息快速崩溃:

A fatal error has been detected by the Java Runtime Environment:

 SIGSEGV (0xb) at pc=0x00002aaaaaef81d1, pid=31063, tid=1141000512

JRE version: 6.0_29-b11
Java VM: Java HotSpot(TM) 64-Bit Server VM (20.4-b02 mixed mode linux-amd64 )
Problematic frame:
J  gnu.trove.impl.hash.TObjectHash.insertKey(Ljava/lang/Object;)I
Run Code Online (Sandbox Code Playgroud)

这里让我感到震惊的是有问题的框架,它总是一样的.我习惯了这里出现的一些库,但从来没有使用Java代码.奇怪的是,一些应该具有相同设置的机器不会受到影响.在Windows上,我也从未见过这个.最近的Java 7版本仍然存在这个问题.从G1 GC切换到任何其他GC会立即解决问题.我们使用由Maven解决的特洛伊库,在那里尝试了几个版本,包括3.0.3 - 总是同样的问题.

有谁知道这可能是什么原因?任何已知的G1 GC错误?是否以特殊的方式编译了特洛伊,这可能会造成这个问题?

更新:不同的应用程序,不同的服务器,最新的Java(7u5),类似的问题:

A fatal error has been detected by the Java Runtime Environment:

SIGSEGV (0xb) at pc=0x00002aadb7a38093, pid=14100, tid=46925573367184

JRE version: 7.0_05-b05
Java VM: Java HotSpot(TM) 64-Bit Server VM (23.1-b03 mixed mode linux-amd64 compressed …
Run Code Online (Sandbox Code Playgroud)

java jvm-crash trove4j

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

使用G1时,分配性能是否会在大量实时实例中降低?

在我们的某些应用程序从CMS转移到G1时,我注意到其中一个应用程序的启动时间延长了4倍.由于GC循环导致的应用程序停止时间不是原因.在比较应用程序行为时,我发现这个在启动后(在一堆12G中)携带了高达2.5亿个活动对象.进一步调查显示,在前500万次分配期间,应用程序的速度正常,但随着活动对象池的增大,性能会越来越差.

进一步的实验表明,一旦达到一定的活动对象阈值,使用G1时新对象的分配确实会减慢.我发现活动对象数量增加一倍似乎在分配所需的时间上增加了大约2.5倍.对于其他GC引擎,因子只有2.这确实可以解释减速.

有两个问题让我怀疑这个结论:

  • 大约约500万个实时实例的阈值似乎与整个堆有关.对于G1,我原以为任何这样的降级阈值都与一个区域有关,而不是整个堆.
  • 我四处寻找网上的文件,解释(或至少说明)这种行为,但我没有找到.我甚至没有找到"超过xxx活对象是邪恶的"这类建议.

所以:如果有人可以告诉我我的观察结果是正确的,并且可能指向一些解释性文件,或者某些有关该领域的建议,那将是很棒的.或者,有人告诉我我做错了什么.:)

这是一个简短的测试用例(多次运行,取平均值,扣除显示的垃圾收集时间):

import java.util.HashMap;

/**
  * Allocator demonstrates the dependency between number of live objects
  * and allocation speed, using various GC algorithms.
  * Call it using, e.g.:
  *   java Allocator -Xmx12g -Xms12g -XX:+PrintGCApplicationStoppedTime -XX:+UseG1GC
  *   java Allocator -Xmx12g -Xms12g -XX:+PrintGCApplicationStoppedTime
  * Deduct stopped times from execution time.
  */
public class Allocator {

public static void main(String[] args) {
    timer(2000000, true);
    for (int i = 1000000; i <= 32000000; i*=2) {
        timer(i, false);
    }
    for …
Run Code Online (Sandbox Code Playgroud)

java performance garbage-collection g1gc

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