【使用场景】
很多应用程序使用Log4j记录日志,如何使用Kafka实时地收集与存储这些Log4j产生的日志呢?一种方案是使用其他组件(比如Flume,或者自己开发程序)实时监控这些日志文件,然后发送至Kafka。而另外一种比较便捷的方案是使用已封装 Kafka 的Log4jAppender:只需在Log4j配置文件中进行简单配置,即可完成将Log4j产生的日志实时发送至Kafka中。但在log4j推送kafka程序的过程中,因log4j其对底层封装的比较好,底层的队列和内存管理对开发者几乎透明,导致使用过程中对出现的内存溢出定位带来一定的障碍。
【现场还原】
场景描述:某柜台产生了一大批历史日志文件,用户希望把这部分历史数据进行深度分析:如用户的购买情况,用户交易的集中时间频率等,进行潜在价值挖掘。但在模拟用户现场导入历史数据的过程中,当历史数据的数量超过一定阀值时(测试数据为800百万),就会出现jvm堆内存不够的异常。
启动命令如下:
运行过程中出现如下错误:
【错误定位】
1、引入利器
(1)为了追踪内存的泄露问题,引入jvm内存排查定位工具: JProfiler。
【Tip:JProfiler把CPU、执行绪和内存的剖析组合在一个强大的应用中。其可提供许多IDE整合和应用服务器整合用途,其是一个独立的应用程序,但其提供Eclipse和IntelliJ等IDE的插件。它允许两个内存剖面评估内存使用情况和动态分配泄漏和CPU剖析