我非常需要更加积极的垃圾回收,最好是能够手动回收! 临时变量也要设成null?方法执行完了变量不就也被回收吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 启动参数-verbose:gc怎么使用?输出到哪里去了? 你需要更大的jvm内存启动参数 用C/C++。手动控制内存释放的。Java GC的机制必然不能让你手动控制。就算=null之后,GC也不是立刻就回收这个内存的。 对于Java的GC,有句话是这么说的,你可以手动调用gc函数,但是Java体系不保证gc立即执行. 对于java的回收机制,正如这位兄弟说的,所以我建议你,在操作完对象时,便设置为null,等待垃圾回收。当gc启动时,他会再第一时间找到没有被引用的对象,进行垃圾回收处理。 我发现对于Full GC (System.gc())。输出信息表明Full GC (System.gc())运行了,但是没有什么作用。待很长时间后,占用内存突然减小很大。为什么?是否说明,Full回收并不彻底?而另一种回收起了这个作用? 还发现把类中的静态的指向对象的变量设置为null,然后运行System.gc(),与不设置为null相比没有任何效果。 手动回收应该是做不到,不过楼主可以让继承WeakReference,在垃圾收集器工作时会被回收。 Full GC才是真正回收,仔细看一下所有Full GC信息,后面有内存大小的描述。 Full GC才是真正回收,仔细看一下所有Full GC信息,后面有内存大小的描述。输出信息:464.129: [Full GC (System.gc()) 12511K->8380K(21296K), 0.0511006 secs]但是通过操作系统的任务管理器查看软件占用内存50M多。是不是这样的:这个回收并没有还给操作系统,而是仍然属于虚拟机。由于软件流程比较多,软件的内存占用就比较大,怎样才能让虚拟机不占有那么多内存,还给操作系统?测试表明启动参数-Xms30m没有效果。 这个方法不太好吧。如果上限真的有作用,那还麻烦了。————————————————————————————————————以官方软件netbeans 7.x为例。我打开1个项目,运行一下,内存占用150M。再打开5个项目,每个都运行一下,内存占用达到300M。把5个项目关闭,内存占用并不会回落到150M左右,用2个小时的时间也不会。这种虚拟机对操作系统申请内存的“只要不还”的问题怎么解决?我们经常讨论垃圾回收如何如何,网上也很多这种网文,都是说如何回收重用而不是再向操作系统申请新的空间。但是回收之后不还给操作系统,这不能不说是个问题吧。 我不是很懂,瞎猜一下吧:JVM这样管理内存是为了快,下一次再申请内存的时候不必通过操作系统,直接在JVM内部把内存分配给Java程序,省去了一次用户和内核空间切换的时间-Xmx 的意思就是说你最多让JVM管理多少堆空间,那么它就会认为占用这些空间都是合理的操作,所以并不会急着还给操作系统。这也是Java有时候会比C快的原因,内存分配和管理上JVM有天然优势,C你一调用malloc,内存就分配了,一调用free,内存就释放了,这些都是很耗时的操作,Java就有个缓冲其实为啥非要立即释放内存呢?只要不产生内存泄漏,占多一些也没所谓吧。你只要控制最大内存占用量即可 达到了多少?因为50M只是堆内存,还有JVM本身的内存占用 55M。参数的确有作用,设置为-Xmx1m不能启动。 55M。参数的确有作用,设置为-Xmx1m不能启动。这个上限没什么意义,我需要回落。 Full GC才是真正回收,仔细看一下所有Full GC信息,后面有内存大小的描述。输出信息:464.129: [Full GC (System.gc()) 12511K->8380K(21296K), 0.0511006 secs]但是通过操作系统的任务管理器查看软件占用内存50M多。是不是这样的:这个回收并没有还给操作系统,而是仍然属于虚拟机。由于软件流程比较多,软件的内存占用就比较大,怎样才能让虚拟机不占有那么多内存,还给操作系统?测试表明启动参数-Xms30m没有效果。是的,Java虚拟机在内存在虚拟机启动时便已经分配,至于分配大小,自己配置参数来控制。还有要看Java虚拟机全部情况,如堆大小,栈大小,线程情况,可以运行jconsole来观察。 http://blog.chinaunix.net/uid-20554039-id-1625573.html这里的说明挺详细的。 你如果想精准地完全自主地控制内存占用,那Java并不是你想要的语言。用C/C++吧 请使用clear();可以减少对象的引用次数。GC有根据引用次数来判断是否有效对象的。对于作用域在结束位置置null跟不置是一样效果的。System.gc()不要写进代码。 sun.misc.Unsafe.allocateMemory(long); sun.misc.Unsafe.freeMemory(long); -Xmx只是指JVM最大可用堆内存,实际占用的内存还需要包含堆外的内存。就像你创建一个JAVA线程,堆里要用掉一点内存,同时堆外也会创建一个需要占用内存的系统线程。一般来说GC执行会将“世界”静止掉,所以尽量少和尽量快的执行GC才是正道。但有时候有些应用如果不自己来管理内存实现起来真的很不理想,比如缓存。所以这种情况而你又要用JAVA的话最好的性能就是自己管理内存了。BigMemoryhttp://terracotta.org/products/bigmemory这个是利用ByteBuffer.allocateDirect方法申请一块内存然后自己来管理,缺点是放入的对象需要序例化。 actionPerformed的问题,小弟求助~~~ 求教一个正则表达式 求这个帖子的地址 继续socket的小白问题 无法加载驱动org.gjt.mm.mysql.driver JCreator Pro里面怎么设置JDBC啊? 输出流的小问题 xiaoxhui(飞)请来接分,只有20分了 请教高手,莫名的错误! 用DatagramSocket通信的问题? 做毕业设计遇到麻烦了,求各位大神帮帮忙!怎样将服务器中的list对象,发到各个客户端的线程里面。 MINA session 问题
输出信息:
464.129: [Full GC (System.gc()) 12511K->8380K(21296K), 0.0511006 secs]
但是通过操作系统的任务管理器查看软件占用内存50M多。是不是这样的:这个回收并没有还给操作系统,而是仍然属于虚拟机。由于软件流程比较多,软件的内存占用就比较大,怎样才能让虚拟机不占有那么多内存,还给操作系统?测试表明启动参数-Xms30m没有效果。
以官方软件netbeans 7.x为例。我打开1个项目,运行一下,内存占用150M。再打开5个项目,每个都运行一下,内存占用达到300M。把5个项目关闭,内存占用并不会回落到150M左右,用2个小时的时间也不会。
这种虚拟机对操作系统申请内存的“只要不还”的问题怎么解决?
我们经常讨论垃圾回收如何如何,网上也很多这种网文,都是说如何回收重用而不是再向操作系统申请新的空间。但是回收之后不还给操作系统,这不能不说是个问题吧。
JVM这样管理内存是为了快,下一次再申请内存的时候不必通过操作系统,直接在JVM内部把内存分配给Java程序,省去了一次用户和内核空间切换的时间-Xmx 的意思就是说你最多让JVM管理多少堆空间,那么它就会认为占用这些空间都是合理的操作,所以并不会急着还给操作系统。这也是Java有时候会比C快的原因,内存分配和管理上JVM有天然优势,C你一调用malloc,内存就分配了,一调用free,内存就释放了,这些都是很耗时的操作,Java就有个缓冲其实为啥非要立即释放内存呢?只要不产生内存泄漏,占多一些也没所谓吧。你只要控制最大内存占用量即可
输出信息:
464.129: [Full GC (System.gc()) 12511K->8380K(21296K), 0.0511006 secs]
但是通过操作系统的任务管理器查看软件占用内存50M多。是不是这样的:这个回收并没有还给操作系统,而是仍然属于虚拟机。由于软件流程比较多,软件的内存占用就比较大,怎样才能让虚拟机不占有那么多内存,还给操作系统?测试表明启动参数-Xms30m没有效果。
是的,Java虚拟机在内存在虚拟机启动时便已经分配,至于分配大小,自己配置参数来控制。还有要看Java虚拟机全部情况,如堆大小,栈大小,线程情况,可以运行jconsole来观察。
这里的说明挺详细的。
对于作用域在结束位置置null跟不置是一样效果的。
System.gc()不要写进代码。
http://terracotta.org/products/bigmemory
这个是利用ByteBuffer.allocateDirect方法申请一块内存然后自己来管理,缺点是放入的对象需要序例化。