据我所知,对于老一代 JVM 的空间,它可以用于两个目的,
- 用于从年轻代提升到老年代的对象?
- 用于特殊用例中的新对象分配(https://stackoverflow.com/questions/9053144/will-i-encounter-java-lang-outofmemoryerror-even-with-no-lack-of-memory)
我的问题是,
- 是否还有其他用例可以利用老年代的空间?
- 我认为将对象从年轻代复制到老年代涉及内存复制,是深拷贝还是浅拷贝?
提前谢谢, 林
据我所知,对于老一代 JVM 的空间,它可以用于两个目的,
我的问题是,
提前谢谢, 林
放置此代码以回答@Lin Ma 在他的评论中提出的问题:
class SomeClass{
private static List<Object> memoryLeakCulprit = new ArrayList<Object>();
void someMethod(Object obj){
//adding the reference of some object in the culprit list
memoryLeakCulprit.add(obj);
}
//supposed to remove the reference passed
void someOtherMethod(Object obj){
obj = null;
//bummer forgot to remove the reference from list
//now the instance is not reachable by obj
//so now as new references are added to culprit list the memory will keep on increasing in size
}
}
UDPATE
如何解决此泄漏
oid someOtherMethod(Object obj){
//before setting the obj reference to null it must be removed from culprit list
memoryLeakCulprit.remove(obj);
//now its safe to set this reference to null
obj = null;
}
解决泄漏的唯一方法是使用JProfiler、VisualVM等分析工具对应用程序进行分析,并找出导致泄漏的类。
当您找到课程时,必须更改代码,这是唯一的方法。
程序退出前无需释放引用。原因是static
变量 ( memoryLeakCulprit
) 绑定到Class对象,一旦您退出程序,所有引用都会自动释放,包括 Class 对象。
另一方面,请务必确保在退出程序之前关闭系统资源(套接字、数据库连接)。
让我回答 2。它绝对不是深拷贝:GC 将对象作为不同的内存块处理,而深拷贝实际上仅意味着复制许多连接到对象图中的不同对象。此外,想象一个动作而不是一个副本会更好地为您服务;复制实际上只是一个“实现细节”,想要的效果是重新定位。