Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.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
Java Log4j是否正在加载内存?_Java_Logging_Log4j - Fatal编程技术网

Java Log4j是否正在加载内存?

Java Log4j是否正在加载内存?,java,logging,log4j,Java,Logging,Log4j,我们可以通过两种方式调用Log4j 1) 在包和调用记录器的每个类中都有静态记录器引用 2) 在一次“静态”类中有一个静态记录器引用,并从任何地方引用此“静态”类 基于内存,通常哪种方法有效,哪种方法好?创建多个记录器将占用更多内存,因为用于Log4j的LoggerRepository需要维护另一个记录器。但是这个内存量应该是微不足道的,通过为每个类使用不同的记录器,您可以很容易地跟踪日志语句的来源。您还可以为不同的包/类打开不同的日志级别。我不建议所有类都使用一个记录器。创建多个记录器将占用更

我们可以通过两种方式调用Log4j

1) 在包和调用记录器的每个类中都有静态记录器引用

2) 在一次“静态”类中有一个静态记录器引用,并从任何地方引用此“静态”类


基于内存,通常哪种方法有效,哪种方法好?

创建多个记录器将占用更多内存,因为用于Log4j的LoggerRepository需要维护另一个记录器。但是这个内存量应该是微不足道的,通过为每个类使用不同的记录器,您可以很容易地跟踪日志语句的来源。您还可以为不同的包/类打开不同的日志级别。我不建议所有类都使用一个记录器。

创建多个记录器将占用更多内存,因为用于Log4j的LoggerRepository需要维护另一个记录器。但是这个内存量应该是微不足道的,通过为每个类使用不同的记录器,您可以很容易地跟踪日志语句的来源。您还可以为不同的包/类打开不同的日志级别。我不建议所有类都使用一个日志记录程序。

第一种方法使您能够在每个类的基础上控制日志记录(例如设置日志记录的级别)。这是以拥有大量记录器实例为代价的

第二种方法为您提供一个Logger实例,但只允许您控制 整个应用程序的日志记录

另外,在长时间运行的应用程序中,拥有大量(静态)记录器实例的唯一持续成本是内存使用量的小增量。因此,这是在内存使用量的小幅度增加和应用程序日志记录的灵活性/可配置性之间的折衷


虽然我不会在每个类中都创建一个日志记录程序,但我认为如果在整个应用程序中只使用一个日志记录程序,您(或您的用户/客户端)可能会后悔。第一种方法使您能够在每个类的基础上控制日志记录(例如设置日志记录的级别)。这是以拥有大量记录器实例为代价的

第二种方法为您提供一个Logger实例,但只允许您控制 整个应用程序的日志记录

另外,在长时间运行的应用程序中,拥有大量(静态)记录器实例的唯一持续成本是内存使用量的小增量。因此,这是在内存使用量的小幅度增加和应用程序日志记录的灵活性/可配置性之间的折衷

虽然我不会在每个类中都创建一个记录器,但我认为如果在整个应用程序中只使用一个记录器,您(或您的用户/客户端)可能会后悔。

显然,方法2的内存效率更高。尽管如此,这样做通常是个坏主意。您将错过使log4j如此有用的每类/包日志过滤功能。除非您使用的是内存非常紧张的预算方法,否则最好使用#1

还有第三种调用log4j的方法,它更需要内存:在每个类中使用一个非静态成员。您可以使用以下内容:
protectedlogger log=Logger.getLogger(getClass())
如果您的类将被子类化,这可能更可取,因为getClass()总是引用实际的实例类。

显然,方法2的内存效率更高。尽管如此,这样做通常是个坏主意。您将错过使log4j如此有用的每类/包日志过滤功能。除非您使用的是内存非常紧张的预算方法,否则最好使用#1

还有第三种调用log4j的方法,它更需要内存:在每个类中使用一个非静态成员。您可以使用以下内容:
protectedlogger log=Logger.getLogger(getClass())

如果您的类将被子类化,这可能更可取,因为getClass()总是引用实际的实例类。

请记住,Log4j在某些情况下会占用PermGen空间,但通常不会随着单个应用程序实例的运行而出现问题,这可能会导致OutOfMemoryError异常

大多数情况下,当您的应用程序部署到JavaEE应用程序服务器时,在每次部署上,上一次部署的静态记录器都将驻留在类加载器中。这只是在多次重新部署应用程序而不重新启动应用程序服务器时出现的问题(我经常在开发过程中整天重新部署应用程序时出现这种情况)


这通常是,可能不是问题,但需要注意。通过搜索类似“log4j permgen”的内容,您可以找到更多关于它的信息。

请记住,log4j在某些情况下存在占用permgen空间的已知问题,但通常不会随着单个应用程序实例的运行而出现,这可能会导致OutOfMemoryError异常

大多数情况下,当您的应用程序部署到JavaEE应用程序服务器时,在每次部署上,上一次部署的静态记录器都将驻留在类加载器中。这只是在多次重新部署应用程序而不重新启动应用程序服务器时出现的问题(我经常在开发过程中整天重新部署应用程序时出现这种情况)


这通常是,可能不是问题,但需要注意。您可以通过搜索类似于“log4j permgen”的内容来查找有关它的更多信息。

对于每个问题,我们可以有多种解决方案。但我们需要选择所有这些解决方案中最好的一个。在Stackoverflow中的问题中,我是否需要选择高投票率的解决方案?对于每个问题,我们可以有多个解决方案。但我们需要选择所有这些解决方案中最好的一个。就我在Stackoverflow中的问题而言,我是否需要选择高投票率的解决方案?