【问题标题】:threads are blocked at the time of loading class via ClassUtils.java通过 ClassUtils.java 加载类时线程被阻塞
【发布时间】:2014-04-01 14:03:12
【问题描述】:

我的应用程序监听kafka 主题并将数据转储到cassandra。线程也从mongo 加载一些信息。 kafka 主题中的滞后增加。我已经看到大多数线程在加载某些类时被阻塞。我在下面附上我的thread_dump

 "KafkaConsumer-49" prio=10 tid=0x00007f1178fdd000 nid=0x78e0 waiting for monitor entry [0x00007f1155fb5000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:403)
        - waiting to lock <0x00000006c0655b58> (a java.lang.Object)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
        at org.springframework.util.ClassUtils.forName(ClassUtils.java:258)
        at org.springframework.data.convert.SimpleTypeInformationMapper.resolveTypeFrom(SimpleTypeInformationMapper.java:56)
        at org.springframework.data.convert.DefaultTypeMapper.readType(DefaultTypeMapper.java:103)
        at org.springframework.data.convert.DefaultTypeMapper.getDefaultedTypeToBeUsed(DefaultTypeMapper.java:144)
        at org.springframework.data.convert.DefaultTypeMapper.readType(DefaultTypeMapper.java:121)
        at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:186)
        at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:176)
        at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:172)
        at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:75)
        at org.springframework.data.mongodb.core.MongoTemplate$ReadDbObjectCallback.doWith(MongoTemplate.java:1840)
        at org.springframework.data.mongodb.core.MongoTemplate.executeFindMultiInternal(MongoTemplate.java:1536)
        at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1336)
        at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1322)
        at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:495)
        at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:486)
        at com.snapdeal.coms.timemachine.mao.TimeMachineMao.getVendorProductsForUploadId(TimeMachineMao.java:32)
        at com.snapdeal.coms.timemachine.service.TimeMachineService.getVendorProductsForUploadIdAndSupc(TimeMachineService.java:35)
        at com.snapdeal.coms.timemachine.event.SupcUploadIdStateUpdateEventHandler.handleEvent(SupcUploadIdStateUpdateEventHandler.java:40)



KafkaConsumer-48" prio=10 tid=0x00007f1178fdb000 nid=0x78df waiting for monitor entry [0x00007f11560b6000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:403)
        - waiting to lock <0x00000006c0655b58> (a java.lang.Object)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
        at org.springframework.util.ClassUtils.forName(ClassUtils.java:258)
        at org.springframework.data.convert.SimpleTypeInformationMapper.resolveTypeFrom(SimpleTypeInformationMapper.java:56)
        at org.springframework.data.convert.DefaultTypeMapper.readType(DefaultTypeMapper.java:103)
        at org.springframework.data.convert.DefaultTypeMapper.getDefaultedTypeToBeUsed(DefaultTypeMapper.java:144)
        at org.springframework.data.convert.DefaultTypeMapper.readType(DefaultTypeMapper.java:121)
        at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:186)
        at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:176)
        at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:172)
        at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:75)
        at org.springframework.data.mongodb.core.MongoTemplate$ReadDbObjectCallback.doWith(MongoTemplate.java:1840)
        at org.springframework.data.mongodb.core.MongoTemplate.executeFindMultiInternal(MongoTemplate.java:1536)
        at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1336)
        at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1322)
        at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:495)
        at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:486)
        at com.snapdeal.coms.timemachine.mao.TimeMachineMao.getVendorProductsForUploadId(TimeMachineMao.java:32)
        at com.snapdeal.coms.timemachine.service.TimeMachineService.getVendorProductsForUploadIdAndSupc(TimeMachineService.java:35)
        at com.snapdeal.coms.timemachine.event.SupcUploadIdStateUpdateEventHandler.handleEvent(SupcUploadIdStateUpdateEventHandler.java:40)
        at com.snapdeal.coms.timemachine.TimeMachine.onEvent(TimeMachine.java:109)

“KafkaConsumer-47”prio=10 tid=0x00007f1178fd9800 nid=0x78de 等待监控入口 [0x00007f11561b7000] java.lang.Thread.State: BLOCKED (在对象监视器上) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:403) - 等待锁定 (a java.lang.Object) 在 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:356) 在 org.springframework.util.ClassUtils.forName(ClassUtils.java:258) 在 org.springframework.data.convert.SimpleTypeInformationMapper.resolveTypeFrom(SimpleTypeInformationMapper.java:56) 在 org.springframework.data.convert.DefaultTypeMapper.readType(DefaultTypeMapper.java:103) 在 org.springframework.data.convert.DefaultTypeMapper.getDefaultedTypeToBeUsed(DefaultTypeMapper.java:144) 在 org.springframework.data.convert.DefaultTypeMapper.readType(DefaultTypeMapper.java:121) 在 org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:186) 在 org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:176) 在 org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:172) 在 org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:75) 在 org.springframework.data.mongodb.core.MongoTemplate$ReadDbObjectCallback.doWith(MongoTemplate.java:1840) 在 org.springframework.data.mongodb.core.MongoTemplate.executeFindMultiInternal(MongoTemplate.java:1536) 在 org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1336) 在 org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1322) 在 org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:495) 在 org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:486)

"KafkaConsumer-46" prio=10 tid=0x00007f1178fd8000 nid=0x78dd waiting for monitor entry [0x00007f11562b8000]

java.lang.Thread.State: BLOCKED(在对象监视器上) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:403) - 等待锁定 (a java.lang.Object) 在 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:356) 在 org.springframework.util.ClassUtils.forName(ClassUtils.java:258) 在 org.springframework.data.convert.SimpleTypeInformationMapper.resolveTypeFrom(SimpleTypeInformationMapper.java:56) 在 org.springframework.data.convert.DefaultTypeMapper.readType(DefaultTypeMapper.java:103) 在 org.springframework.data.convert.DefaultTypeMapper.getDefaultedTypeToBeUsed(DefaultTypeMapper.java:144) 在 org.springframework.data.convert.DefaultTypeMapper.readType(DefaultTypeMapper.java:121) 在 org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:186) 在 org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:176) 在 org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:172) 在 org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:75) 在 org.springframework.data.mongodb.core.MongoTemplate$ReadDbObjectCallback.doWith(MongoTemplate.java:1840) 在 org.springframework.data.mongodb.core.MongoTemplate.executeFindMultiInternal(MongoTemplate.java:1536) 在 org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1336) 在 org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1322) 在 org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:495) 在 org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:486) 在 com.snapdeal.coms.timemachine.mao.TimeMachineMao.getVendorProductsForUploadId(TimeMachineMao.java:32) 在 com.snapdeal.coms.timemachine.service.TimeMachineService.getVendorProductsForUploadIdAndSupc(TimeMachineService.java:35) 在 com.snapdeal.coms.timemachine.event.SupcUploadIdStateUpdateEventHandler.handleEvent(SupcUploadIdStateUpdateEventHandler.java:40)

我不确定为什么所有线程都被阻塞。我认为类只加载一次,以后不需要任何锁。

【问题讨论】:

    标签: java classloader apache-kafka spring-mongo


    【解决方案1】:

    您是否尝试使用ConsumerOffsetChecker 来查看您的消费者是否还活着?您可以在 $KAFKA_ROOT_DIR/ 文件夹中尝试以下命令

      bin/kafka-run-class.sh kafka.tools.ConsumerOffsetChecker --group consumer-group1 --zkconnect zkhost:zkport --topic topic1
    

    以下是他们的FAQ 页面上的一些注释

    如果消费者偏移量在一段时间后没有移动,那么消费者可能已经停止。如果消费者偏移量正在移动,但消费者滞后(日志末尾和消费者偏移量之间的差异)正在增加,则消费者比生产者慢。如果消费者速度慢,典型的解决方案是增加消费者的并行度。这可能需要增加主题的分区数。

    上面的常见问题页面还解释了您的消费者被屏蔽的可能原因,可能值得一看。

    【讨论】:

    • 我已经检查过了。消费者抵消正在移动,但滞后正在增加。我在我的主题上创建了 100 个分区,目前正在运行 50 个消费者线程。在分析线程转储时,我看到大多数线程处于阻塞状态。已经附加了线程转储
    • If consumer offset is moving, but consumer lag (difference between the end of the log and the consumer offset) is increasing, the consumer is slower than the producer -- 来自常见问题解答
    • 我知道这就是我增加消费者线程数的原因。但大多数线程在类加载器从 mongo 检索数据时处于阻塞状态。我不明白为什么会再次加载同一个类。
    • 这是否意味着您的 kafka 工作正常?抱歉,我有点困惑这两个进程到底是如何相关的,从队列中消耗并从 mongo 加载。这两个独立的是否并行运行?
    • 实际上我的消费者线程从 kakfa 消费并将这些事件保存在 cassandra 但在保存之前 cassandra 也从 mongo 收到了一些额外的信息。
    【解决方案2】:

    问题在于从 mongo 获取数据。有大量数据,没有实现分页,特定请求没有套接字超时,因此线程被阻塞。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-25
      • 1970-01-01
      • 2013-11-16
      • 1970-01-01
      • 2021-03-11
      • 1970-01-01
      • 2018-07-21
      • 2019-09-26
      相关资源
      最近更新 更多