1

据我所知,对于老一代 JVM 的空间,它可以用于两个目的,

  1. 用于从年轻代提升到老年代的对象?
  2. 用于特殊用例中的新对象分配(https://stackoverflow.com/questions/9053144/will-i-encounter-java-lang-outofmemoryerror-even-with-no-lack-of-memory

我的问题是,

  1. 是否还有其他用例可以利用老年代的空间?
  2. 我认为将对象从年轻代复制到老年代涉及内存复制,是深拷贝还是浅拷贝?

提前谢谢, 林

4

2 回答 2

1

放置此代码以回答@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;

        }

解决泄漏的唯一方法是使用JProfilerVisualVM等分析工具对应用程序进行分析,并找出导致泄漏的类

当您找到课程时,必须更改代码,这是唯一的方法。

程序退出前无需释放引用。原因是static变量 ( memoryLeakCulprit) 绑定到Class对象,一旦您退出程序,所有引用都会自动释放,包括 Class 对象。

另一方面,请务必确保在退出程序之前关闭系统资源(套接字、数据库连接)。

于 2012-12-03T13:20:57.977 回答
1

让我回答 2。它绝对不是深拷贝:GC 将对象作为不同的内存块处理,而深拷贝实际上仅意味着复制许多连接到对象图中的不同对象。此外,想象一个动作而不是一个副本会更好地为您服务;复制实际上只是一个“实现细节”,想要的效果是重新定位。

于 2012-12-02T15:40:22.093 回答