Java android中的静态单例类内存泄漏
我有一个静态单例类,它扩展了我的用户对象:Java android中的静态单例类内存泄漏,java,android,memory-leaks,Java,Android,Memory Leaks,我有一个静态单例类,它扩展了我的用户对象: public class TestSingleton extends User{ private static TestSingleton singletonInstance; private TestSingleton() { } public static TestSingleton getObj() { if (singletonInstance == null) {
public class TestSingleton extends User{
private static TestSingleton singletonInstance;
private TestSingleton() {
}
public static TestSingleton getObj() {
if (singletonInstance == null) {
singletonInstance = new TestSingleton();
}
return singletonInstance;
}
}
单例的目的是避免在我希望在不同活动中使用我的用户对象时创建新实例:
TestSingleton test = new TestSingleton();
test.doSomthing();
在我的应用程序生命周期中,将其写在一行并只创建一次实例:
TestSingleton.getObj().doSomthing();
我的问题是:
使用静态单例是否会造成内存泄漏并保留对我使用单例的任何活动的引用
使用安全吗?或者有更好的解决方案吗?如果您只需要一个
User
实例,则不需要扩展它。您在TestSingleton
中所做的只是在User
类中进行
例如:
public class User{
private static User singletonInstance;
private User() {
}
public static User getObj() {
if (singletonInstance == null) {
singletonInstance = new User();
}
return singletonInstance;
}
}
更新:
用于螺纹安全
public synchronized static User getObj() {
if (singletonInstance == null) {
singletonInstance = new User();
}
return singletonInstance;
}
我认为在这种方法中,您不需要考虑内存泄漏
这是使用静态单例创建内存泄漏和保持引用吗
对于任何活动,我都使用单例
在99.9%的案例中不会出现这种情况
Is it safe to use?
这取决于你所说的安全。例如,您的实现不是线程安全的。如果从两个不同的线程调用getObj(),可能会发生实例化TestSingleton两次的情况
or there is a better solution?
有一个使用枚举的单例模式的实现。您可以找到一个关于有效Java的示例
A memory leak may happen when an object is stored in memory but cannot be accessed by the running code
对于单例,只创建了一个对象。而且它只有在第一次使用时才被创建。不存在可能的内存泄漏。
只有当您希望使用多线程时,才必须同步实例(),以便只创建一次对象
99.99%确定不会有任何内存泄漏是的,单例可能会导致内存泄漏,请阅读以下帖子: 在Android生命周期中,活动可能会被重新创建,并且您的单例可能会保留对旧活动实例的引用,从而防止它被垃圾收集。这意味着如果保留这些引用,则应该在Activity.onDestroy()上的singleton中将它们置为空 仅供参考,当应用程序被销毁时,单身者也可能被销毁,所以你不能依赖它
您可能需要考虑在App Stor或应用程序对象中持久地保存数据。
您确定它是在创建漏洞还是在请求它?就我所知,不会的。除非用户
持有对某些上下文的引用,例如。请注意,您的单例当前不是线程安全的。您能用枚举
完成您需要的吗?活动
有对单例的引用,而不是相反。这意味着singleton不会持有对任何活动的引用
,但只有当持有对您的singleton的引用的所有活动都被销毁时,singleton才会被销毁Fildor-是的,我在问,用户只是一个java类,它的方法不获取任何上下文或活动参数。问题是,我的用户对象是源文件夹的一部分,它包含多个对象,我有一个类似于用户对象的单例,它在服务器的git中,所以我希望避免在任何拉取中更改类。我可以在我的singleton类中使用synchronized,它将获得相同的效果吗?是的,您可以&这将获得相同的效果&您的代码将更加可靠。实际上,“synchronized”的使用与最佳实践类似&它将100%保证您永远不会获得超过一个实例。引用您在回答中链接的帖子“因此,关键字static本身可能会导致内存泄漏,如果它引用Activity
对象,那么您在使用它时应该非常小心。”您可以通过使用应用程序上下文来轻松解决这个问题。不会导致内存泄漏,但无论是否使用,都会实例化SingleTonistance。