java静态列表导致内存泄漏

问题描述 投票:0回答:1
I have following code which seems to be causing some memory leaks. This code snippet(i.e. hasPermissions()) get executed every time when a user performs an action.

因此,根据我的理解,由于 Map 权限是静态对象,因此在 hasPermission() 方法内创建的所有 PermissionsList 对象都引用全局静态对象(即权限);因此,是不是没有资格被垃圾收集?

以下是 Eclipse Memory Analyzer 工具中显示的泄漏嫌疑人的堆转储。当我导航到详细信息时,它显示带有以下代码片段的类。我发现Java List.addAll()函数内部创建LinkedList。我仍在尝试理解这里到底发生了什么。感谢您的想法。

public class AccessManager {
    
    
        private static Map <Integer, List> permissions;
    
        public static void init()
        {
            //initiate permissions and add values
        }
        
        public static boolean hasPermissions(List<Integer> accessLevels, String action)
        {
    
            if (permissions == null)
                init();
            
            List permissionsList = null;
            
            for (Integer a : accessLevels) {
                
                if (permissionsList == null) {
                    permissionsList = permissions.get(a);
                } else {
                    permissionsList.addAll(permissions.get(a));
                }
            }
            
            if(permissionsList.contains(action)){
                return true;
            }
            
            return false;
        }
    
    }
java arraylist static jvm garbage-collection
1个回答
0
投票

我将把代码更改为下面的代码,这样它就不会在 hasPermission() 中创建本地对象:permissionList。想知道是否可以解决问题。

public class AccessManager {


    private static Map <Integer, List> permissions;

    public static void init()
    {
        //initiate permissions and add values
    }
    
    public static boolean hasPermissions(List<Integer> accessLevels, String action)
    {

        if (permissions == null)
            init();
            
        for (Integer a : accessLevels) {
            
            if (permissions.get(a).contains(action)) {
                return true;
            }
        }
        
        return false;
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.