gpt4 book ai didi

java - java 方法内多个 ArrayList 初始化可能出现的内存问题

转载 作者:太空宇宙 更新时间:2023-11-04 09:09:43 25 4
gpt4 key购买 nike

我目前正在分析 Controller 方法的代码质量,该方法有一些 ArrayList 初始化,如下所示:

public controller(Aggregate agr) {
List<FCompound> fCompounds = new ArrayList<>();
List<CCompound> cCompounds = new ArrayList<>();
List<Dist> oDist = new ArrayList<>();
List<Trans> oTrans = new ArrayList<>();

List<CContent> cContents = new ArrayList<>();
List<FDist> fDidst = new ArrayList<>();
List<CDist> cDist = new ArrayList<>();
List<FDist> efDist = new ArrayList<>();
List<CDist> ecdist = new ArrayList<>();

List<KList> kList = new ArrayList<>();

实际上,通过数据库服务返回的列表分配给不同的ArrayList对象是不变的

List<FCompound> fCompounds = DBservice().getAllfCompounds();
List<CCompound> cCompounds = DBservice().getAllcCompounds();
List<Dist> oDist = DBservice().getODist();
List<Trans> oTrans = DBservice().getOTrance();

List<CContent> cContents = DBservice().cContent();
List<FDist> fDidst = DBservice().getFDist();
List<CDist> cDist = DBservice().getcDist();
List<FDist> efDist = DBservice().getefDist();
List<CDist> ecdist = DBservice().getecDist();

List<KList> kList = DBservice().getKDist();
}

几乎立即意味着第一个代码片段中创建的所有 ArrayList 对象都是用于垃圾回收的 Toast

首先的问题是,由于为 100% 的应用程序流量提供服务的 1 个单片 Controller 的设计不佳,每个请求都会调用此 Controller 方法,现在我开始怀疑这是否会因堆空间减少而导致内存泄漏?

解决此问题的方法是什么,将列表初始化为 null

        List<FCompound> fCompounds = null;

或者它不会改变任何东西?

有没有办法通过该方法的压力测试来分析堆空间?

最佳答案

要分析堆空间,您可以使用 VisualVM。直到Java 8,它是随Oracle JDK8一起提供的。从 JDK 9 开始,Visual VM 将不再包含在 Oracle JDK 中。您可以通过 https://visualvm.github.io/download.html 获取.

对于你的第一个问题,由于堆空间较小,不会发生内存泄漏。每当您创建对象并且不再引用它时,它将有资格进行垃圾回收。在您的 Controller 中,它几乎没有数组初始化,例如

List<FCompound> fCompounds = new ArrayList<>();

现在,当执行下面的行时,上面的 arrayList 对象就有资格进行垃圾回收。

List<FCompound> fCompounds = DBservice().getAllfCompounds();

据我所知,这些对象甚至无法在第一次垃圾收集中幸存下来,并在执行伊甸园空间的垃圾收集时被销毁。所以不用担心。即使您也可以使用我提到的上述工具进行检查。

您甚至可以将 arraylist 初始化为 null。

List<FCompound> fCompounds = null;

但是,在这种情况下,如果您的数据库服务返回 null(我不知道您的数据库服务是如何实现的)然后你可以得到NullPointerException。因此,要使用它并摆脱 NPE,您可以在从数据库服务返回任何内容时使用 java.util.Optional。

关于java - java 方法内多个 ArrayList 初始化可能出现的内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59798881/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com