锁定老帖子 主题:讨论:单例和静态方法的深入讨论
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (3)
|
|
---|---|
作者 | 正文 |
发表时间:2011-01-10
超级潜水员 写道 蛋疼的忧虑,从没有担心class占内存及回收的,你就算有几亿行代码吧? 能占1G内存么?
不知道有个perm吗? |
|
返回顶楼 | |
发表时间:2011-01-10
对象(实例)永远在Heap上面的,无论是你否是单例。
LZ,误会了,单例模式最多用于那些创建对象开销比较大(时间和空间两个维度),不一定是指内存消耗大。比如:网络延时、文件加载。功能决定了物理空间的大小,而不是方式。 同时,建议LZ应该再深入学习Java数据和元数据。简单地说,编译时需要的属于元数据,比如代码(看得到的方法和字段定义,在Java文件中)。看不到的,在运行时中的数据才是非元数据。 还有类是可以卸载的,肯定是先卸载再回收啊。 |
|
返回顶楼 | |
发表时间:2011-01-10
mercyblitz 写道 对象(实例)永远在Heap上面的,无论是你否是单例。
LZ,误会了,单例模式最多用于那些创建对象开销比较大(时间和空间两个维度),不一定是指内存消耗大。比如:网络延时、文件加载。功能决定了物理空间的大小,而不是方式。 同时,建议LZ应该再深入学习Java数据和元数据。简单地说,编译时需要的属于元数据,比如代码(看得到的方法和字段定义,在Java文件中)。看不到的,在运行时中的数据才是非元数据。 还有类是可以卸载的,肯定是先卸载再回收啊。 +1 单例模式,少new带来的好处是大大滴. |
|
返回顶楼 | |
发表时间:2011-01-10
请教一下前面的几位高手,类怎么卸载啊?
|
|
返回顶楼 | |
发表时间:2011-01-10
zhuanggl 写道 超级潜水员 写道 蛋疼的忧虑,从没有担心class占内存及回收的,你就算有几亿行代码吧? 能占1G内存么?
不知道有个perm吗? 我可不是心血来潮可设这个讨论帖的。在我的项目中,确实出现问题了,经过对堆内存的分析,发现有大量的装载类对象没有被回收,而我的项目中使用了大量的辅助类(里面方法为static的)。 |
|
返回顶楼 | |
发表时间:2011-01-10
躁动的绵羊 写道 zhuanggl 写道 超级潜水员 写道 蛋疼的忧虑,从没有担心class占内存及回收的,你就算有几亿行代码吧? 能占1G内存么?
不知道有个perm吗? 我可不是心血来潮可设这个讨论帖的。在我的项目中,确实出现问题了,经过对堆内存的分析,发现有大量的装载类对象没有被回收,而我的项目中使用了大量的辅助类(里面方法为static的)。 这个没有问题,如果不需要用的 方法,可以不写。但是元信息占用内存不大,除非你的项目动态产生了很多字节码。元信息(static方法、字段等)不是放在堆中的,而是放在永久区域,这区域很少被GC。 |
|
返回顶楼 | |
发表时间:2011-01-10
mercyblitz 写道 躁动的绵羊 写道 zhuanggl 写道 超级潜水员 写道 蛋疼的忧虑,从没有担心class占内存及回收的,你就算有几亿行代码吧? 能占1G内存么?
不知道有个perm吗? 我可不是心血来潮可设这个讨论帖的。在我的项目中,确实出现问题了,经过对堆内存的分析,发现有大量的装载类对象没有被回收,而我的项目中使用了大量的辅助类(里面方法为static的)。 这个没有问题,如果不需要用的 方法,可以不写。但是元信息占用内存不大,除非你的项目动态产生了很多字节码。元信息(static方法、字段等)不是放在堆中的,而是放在永久区域,这区域很少被GC。 类和对象一样,在不被使用的时候,也是会被回收的。如果回收了,则这个类对它的类加载器(装载该类的对象)的引用也就没了,从而它的装载类对象就会被垃圾收集。 现在占堆内存的不是这个类的资源,而是把它加载到方法区的装载类对象,一直不被GC。 |
|
返回顶楼 | |
发表时间:2011-01-10
躁动的绵羊 写道 mercyblitz 写道 躁动的绵羊 写道 zhuanggl 写道 超级潜水员 写道 蛋疼的忧虑,从没有担心class占内存及回收的,你就算有几亿行代码吧? 能占1G内存么?
不知道有个perm吗? 我可不是心血来潮可设这个讨论帖的。在我的项目中,确实出现问题了,经过对堆内存的分析,发现有大量的装载类对象没有被回收,而我的项目中使用了大量的辅助类(里面方法为static的)。 这个没有问题,如果不需要用的 方法,可以不写。但是元信息占用内存不大,除非你的项目动态产生了很多字节码。元信息(static方法、字段等)不是放在堆中的,而是放在永久区域,这区域很少被GC。 类和对象一样,在不被使用的时候,也是会被回收的。如果回收了,则这个类对它的类加载器(装载该类的对象)的引用也就没了,从而它的装载类对象就会被垃圾收集。 现在占堆内存的不是这个类的资源,而是把它加载到方法区的装载类对象,一直不被GC。 那就和你前面说的没有一点关系,关键还是在为什么没有被回收! |
|
返回顶楼 | |
发表时间:2011-01-10
躁动的绵羊 写道 mercyblitz 写道 躁动的绵羊 写道 zhuanggl 写道 超级潜水员 写道 蛋疼的忧虑,从没有担心class占内存及回收的,你就算有几亿行代码吧? 能占1G内存么?
不知道有个perm吗? 我可不是心血来潮可设这个讨论帖的。在我的项目中,确实出现问题了,经过对堆内存的分析,发现有大量的装载类对象没有被回收,而我的项目中使用了大量的辅助类(里面方法为static的)。 这个没有问题,如果不需要用的 方法,可以不写。但是元信息占用内存不大,除非你的项目动态产生了很多字节码。元信息(static方法、字段等)不是放在堆中的,而是放在永久区域,这区域很少被GC。 类和对象一样,在不被使用的时候,也是会被回收的。如果回收了,则这个类对它的类加载器(装载该类的对象)的引用也就没了,从而它的装载类对象就会被垃圾收集。 现在占堆内存的不是这个类的资源,而是把它加载到方法区的装载类对象,一直不被GC。 lz说到 类和对象一样,在不被使用的时候,也是会被回收的。 能说明什么时候叫作类不被使用。 |
|
返回顶楼 | |
发表时间:2011-01-10
最后修改:2011-01-10
按我的理解,ClassLoader中,如果调用了 defineClass后就不能在该 ClassLoader中remove了
前面几位高手都说能卸载,求教卸载类的方法... 按我的理解,被ClassLoader装载过的类应该是有被ClassLoader中不可操作的强引用所引用,只有在classLoader本身被GC时,被该CLASSLOADER装载过的CLASS才有可能被GC(还要排除ClassLoader以外没有任何强引用去引用该class) 如果我理解错了,求批。 |
|
返回顶楼 | |