Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 由于卡夫卡常见指标,Spring启动内存不足_Spring Boot_Apache Kafka_Out Of Memory_Spring Kafka_Spring Jmx - Fatal编程技术网

Spring boot 由于卡夫卡常见指标,Spring启动内存不足

Spring boot 由于卡夫卡常见指标,Spring启动内存不足,spring-boot,apache-kafka,out-of-memory,spring-kafka,spring-jmx,Spring Boot,Apache Kafka,Out Of Memory,Spring Kafka,Spring Jmx,我们有一个Spring Boot应用程序,上周它的堆内存用完了。由于启用了HeapDumpOnOutOfMemory标志,我们可以看到在4GB堆中,com.sun.jmx.mbeanserver.NamedObject占用了大约3.7GB的空间 所有这些对象都有键/值条目,如客户id=producer XXXX,type=producer metrics 我们在日志中搜索,几周前这些生产商已经关闭 为什么这些对象没有被垃圾收集?这是JMX bean的默认行为吗?在其他任何应用程序中都没有看到这一

我们有一个Spring Boot应用程序,上周它的堆内存用完了。由于启用了HeapDumpOnOutOfMemory标志,我们可以看到在4GB堆中,
com.sun.jmx.mbeanserver.NamedObject
占用了大约3.7GB的空间

所有这些对象都有键/值条目,如
客户id=producer XXXX,type=producer metrics

我们在日志中搜索,几周前这些生产商已经关闭

为什么这些对象没有被垃圾收集?这是JMX bean的默认行为吗?在其他任何应用程序中都没有看到这一点,我们可以为卡夫卡制作人禁用JMX吗

我们正在使用SpringBootVersion2.1.5.Release和SpringKafka版本2.2.6.Release

代码:-

ProducerRecord<String, String> record = new ProducerRecord<>("topic", message);
producer.send(record, (RecordMetadata metadata, Exception exception) -> {
if (exception != null) {
    logger.error("Exception in posting response to Kafka {}", exception);
    logger.error(exception.getMessage());
} else {
    logger.info("Request sent to Kafka: Offset: {} ", metadata.offset());
}
producer.close();
});

public KafkaProducer<String, String> getProducer(String bootstrapServers){
    Properties property = new Properties();
    property.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
    property.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
    property.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
    return new KafkaProducer<>(property);

}
ProducerRecord记录=新的ProducerRecord(“主题”,消息);
producer.send(记录,(记录元数据,异常)->{
if(异常!=null){
logger.error(“发布对Kafka{}的响应时出现异常”,异常);
logger.error(exception.getMessage());
}否则{
info(“发送到Kafka:Offset:{}的请求”,metadata.Offset());
}
producer.close();
});
公共KafkaProducer getProducer(字符串引导服务器){
Properties属性=新属性();
put(ProducerConfig.BOOTSTRAP\u SERVERS\u CONFIG,bootstrapserver);
put(ProducerConfig.KEY\u SERIALIZER\u CLASS\u CONFIG,StringSerializer.CLASS);
property.put(ProducerConfig.VALUE\u SERIALIZER\u CLASS\u CONFIG,StringSerializer.CLASS);
归还新卡夫卡制作人(财产);
}

您能显示您的代码和配置吗?并展示如何使用生产者。默认情况下,所有操作都使用一个生产者。使用事务时,将维护生产者缓存(或在使用者启动事务时,为每个组/主题.partition保留生产者缓存)。只有当生产工厂被摧毁时,生产商才被实际关闭(我已确认MBean当时未注册)。不清楚为什么缓存中会有这么多生产者实例,除非它们不是“close()”d,也就是当它们返回到缓存时。代码如下:-
ProducerRecord记录=新的ProducerRecord(“主题”,消息);producer.send(record,(RecordMetadata metadata,Exception Exception)->{if(Exception!=null){logger.error(“发布对Kafka的响应时出现异常{}”,Exception);logger.error(Exception.getMessage();}else{logger.info(“发送到Kafka的请求:偏移量:{}”,metadata.Offset());}producer.close();});作为producer的一部分,我们正在设置字符串序列化程序和引导服务器;改为编辑问题。你需要展示你是如何创建制作人的,而不是如何使用它。这似乎不是在使用弹簧卡夫卡。您使用的是Spring的
DefaultKafkaProducerFactory
?嗨,Garry,我们使用的是
org.apache.kafka.clients.producer.KafkaProducer
,那么您为什么要在这个问题上加上标签?您直接使用的是Kafka API,而不是Spring。参见javadocs以了解《卡夫卡制作人》
;您不需要为每次发送创建制作人;每次使用相同的一个。