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;
}
}
我将把代码更改为下面的代码,这样它就不会在 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;
}
}