论坛首页 Java企业应用论坛

讨论:单例和静态方法的深入讨论

浏览 14180 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (3)
作者 正文
   发表时间:2011-01-10  
超级潜水员 写道
蛋疼的忧虑,从没有担心class占内存及回收的,你就算有几亿行代码吧? 能占1G内存么?

不知道有个perm吗?
0 请登录后投票
   发表时间:2011-01-10  
对象(实例)永远在Heap上面的,无论是你否是单例。

LZ,误会了,单例模式最多用于那些创建对象开销比较大(时间和空间两个维度),不一定是指内存消耗大。比如:网络延时、文件加载。功能决定了物理空间的大小,而不是方式。

同时,建议LZ应该再深入学习Java数据和元数据。简单地说,编译时需要的属于元数据,比如代码(看得到的方法和字段定义,在Java文件中)。看不到的,在运行时中的数据才是非元数据。

还有类是可以卸载的,肯定是先卸载再回收啊。
0 请登录后投票
   发表时间:2011-01-10  
mercyblitz 写道
对象(实例)永远在Heap上面的,无论是你否是单例。

LZ,误会了,单例模式最多用于那些创建对象开销比较大(时间和空间两个维度),不一定是指内存消耗大。比如:网络延时、文件加载。功能决定了物理空间的大小,而不是方式。

同时,建议LZ应该再深入学习Java数据和元数据。简单地说,编译时需要的属于元数据,比如代码(看得到的方法和字段定义,在Java文件中)。看不到的,在运行时中的数据才是非元数据。

还有类是可以卸载的,肯定是先卸载再回收啊。


+1

单例模式,少new带来的好处是大大滴.
0 请登录后投票
   发表时间:2011-01-10  
请教一下前面的几位高手,类怎么卸载啊?
0 请登录后投票
   发表时间:2011-01-10  
zhuanggl 写道
超级潜水员 写道
蛋疼的忧虑,从没有担心class占内存及回收的,你就算有几亿行代码吧? 能占1G内存么?

不知道有个perm吗?


     我可不是心血来潮可设这个讨论帖的。在我的项目中,确实出现问题了,经过对堆内存的分析,发现有大量的装载类对象没有被回收,而我的项目中使用了大量的辅助类(里面方法为static的)。
    
0 请登录后投票
   发表时间:2011-01-10  
躁动的绵羊 写道
zhuanggl 写道
超级潜水员 写道
蛋疼的忧虑,从没有担心class占内存及回收的,你就算有几亿行代码吧? 能占1G内存么?

不知道有个perm吗?


     我可不是心血来潮可设这个讨论帖的。在我的项目中,确实出现问题了,经过对堆内存的分析,发现有大量的装载类对象没有被回收,而我的项目中使用了大量的辅助类(里面方法为static的)。
    


这个没有问题,如果不需要用的 方法,可以不写。但是元信息占用内存不大,除非你的项目动态产生了很多字节码。元信息(static方法、字段等)不是放在堆中的,而是放在永久区域,这区域很少被GC。
0 请登录后投票
   发表时间:2011-01-10  
mercyblitz 写道
躁动的绵羊 写道
zhuanggl 写道
超级潜水员 写道
蛋疼的忧虑,从没有担心class占内存及回收的,你就算有几亿行代码吧? 能占1G内存么?

不知道有个perm吗?


     我可不是心血来潮可设这个讨论帖的。在我的项目中,确实出现问题了,经过对堆内存的分析,发现有大量的装载类对象没有被回收,而我的项目中使用了大量的辅助类(里面方法为static的)。
    


这个没有问题,如果不需要用的 方法,可以不写。但是元信息占用内存不大,除非你的项目动态产生了很多字节码。元信息(static方法、字段等)不是放在堆中的,而是放在永久区域,这区域很少被GC。


类和对象一样,在不被使用的时候,也是会被回收的。如果回收了,则这个类对它的类加载器(装载该类的对象)的引用也就没了,从而它的装载类对象就会被垃圾收集。
  现在占堆内存的不是这个类的资源,而是把它加载到方法区的装载类对象,一直不被GC。
0 请登录后投票
   发表时间:2011-01-10  
躁动的绵羊 写道
mercyblitz 写道
躁动的绵羊 写道
zhuanggl 写道
超级潜水员 写道
蛋疼的忧虑,从没有担心class占内存及回收的,你就算有几亿行代码吧? 能占1G内存么?

不知道有个perm吗?


     我可不是心血来潮可设这个讨论帖的。在我的项目中,确实出现问题了,经过对堆内存的分析,发现有大量的装载类对象没有被回收,而我的项目中使用了大量的辅助类(里面方法为static的)。
    


这个没有问题,如果不需要用的 方法,可以不写。但是元信息占用内存不大,除非你的项目动态产生了很多字节码。元信息(static方法、字段等)不是放在堆中的,而是放在永久区域,这区域很少被GC。


类和对象一样,在不被使用的时候,也是会被回收的。如果回收了,则这个类对它的类加载器(装载该类的对象)的引用也就没了,从而它的装载类对象就会被垃圾收集。
  现在占堆内存的不是这个类的资源,而是把它加载到方法区的装载类对象,一直不被GC。



那就和你前面说的没有一点关系,关键还是在为什么没有被回收!
0 请登录后投票
   发表时间:2011-01-10  
躁动的绵羊 写道
mercyblitz 写道
躁动的绵羊 写道
zhuanggl 写道
超级潜水员 写道
蛋疼的忧虑,从没有担心class占内存及回收的,你就算有几亿行代码吧? 能占1G内存么?

不知道有个perm吗?


     我可不是心血来潮可设这个讨论帖的。在我的项目中,确实出现问题了,经过对堆内存的分析,发现有大量的装载类对象没有被回收,而我的项目中使用了大量的辅助类(里面方法为static的)。
    


这个没有问题,如果不需要用的 方法,可以不写。但是元信息占用内存不大,除非你的项目动态产生了很多字节码。元信息(static方法、字段等)不是放在堆中的,而是放在永久区域,这区域很少被GC。


类和对象一样,在不被使用的时候,也是会被回收的。如果回收了,则这个类对它的类加载器(装载该类的对象)的引用也就没了,从而它的装载类对象就会被垃圾收集。
  现在占堆内存的不是这个类的资源,而是把它加载到方法区的装载类对象,一直不被GC。


lz说到 类和对象一样,在不被使用的时候,也是会被回收的。 能说明什么时候叫作类不被使用。
0 请登录后投票
   发表时间:2011-01-10   最后修改:2011-01-10
按我的理解,ClassLoader中,如果调用了 defineClass后就不能在该 ClassLoader中remove了

前面几位高手都说能卸载,求教卸载类的方法...

按我的理解,被ClassLoader装载过的类应该是有被ClassLoader中不可操作的强引用所引用,只有在classLoader本身被GC时,被该CLASSLOADER装载过的CLASS才有可能被GC(还要排除ClassLoader以外没有任何强引用去引用该class)

如果我理解错了,求批。

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics