java系统占用内存大怎么办4.7G算高吗?

如何释放java所耗系统内存? - 开源中国社区
当前访客身份:游客 [
当前位置:
先看模拟代码如下:
public class TestMem {
public static void main(String[] args) throws InterruptedException {
System.out.println(new Date() + & 用数组模拟一个较大内存块:long[] l = new long[6000000]&);
long[] l = new long[6000000];
System.out.println(new Date() + & 等待30s开始,此时需要记录任务管理器中的该java进程使用内存大小&);
Thread.sleep(30 * 1000);
System.out.println(new Date() + & 等待30s结束,之后清理内存并调用gc方法强制回收内存&);
System.gc();
System.out.println(new Date() + & 等待5s使得gc执行完毕&);
Thread.sleep(5 * 1000);
System.out.println(new Date() + & 内存清理完毕,重新查看任务管理器发现该java进程使用的内存一直没有变化&);
System.out.println(new Date() + & -------------问题开始------------------&);
System.out.println(new Date() + & 按照这个执行过程,只要jvm不退出,为何在任务管理器中看到该java进程所耗内存没有降下来???&);
System.out.println(new Date() + & -------------问题结束------------------&);
System.out.println(new Date() + & 等待300s后程序执行完毕&);
Thread.sleep(5*60 * 1000);
& & &1.按照这个执行过程,只要jvm不退出,为何在任务管理器中看到该java进程所耗内存没有降下来?
& & &2.有没有办法解决这个问题呢?
共有21个答案
<span class="a_vote_num" id="a_vote_num_
当程序跳出
main()之后 , 里面的对象就会进入回收区
<span class="a_vote_num" id="a_vote_num_
垃圾回收不是人为控制的,java会帮你处理的,你只要把不要的设置=null就行了。
system.gc()这个方法有人说是垃圾回收,其实不是的。
<span class="a_vote_num" id="a_vote_num_
引用来自“#JIN”的答案当程序跳出
main()之后 , 里面的对象就会进入回收区这个我明白,但是如果main方法不退出,那么按照你的意思,是不是对象将一直不能回收呢?谢谢回复
<span class="a_vote_num" id="a_vote_num_
引用来自“梅公子”的答案垃圾回收不是人为控制的,java会帮你处理的,你只要把不要的设置=null就行了。
system.gc()这个方法有人说是垃圾回收,其实不是的。现在的问题是我已经将不用的对象的引用赋值为null,但是不管是否调用gc(是否真正能显示回收再议),只要main不退出,那么从任务管理器中就看到该java进程占用的内存一直没有被OS回收,并且我已经做过实验,运行多久都是这样的。
现在的问题是就这个示例,用什么办法可以将java进程占用的系统内存降下来,前提相关的对象所占的内存已经释放(对象引用赋值为null或是显示调用gc或是其他)。谢谢回复
<span class="a_vote_num" id="a_vote_num_
你打开你的控制面板,里面有个JAVA,里面有个什么控制台的东西,打开了里面有很多选项,好像是按数字就可以垃圾回收,你可以试下能不能被OS回收~
<span class="a_vote_num" id="a_vote_num_
其实你可以改变程序的设计方式,把你要做的事情局部化,外部method 循环定时掉用你的代码,就可以了嘛
<span class="a_vote_num" id="a_vote_num_
1、执行1次gc可能不够,我看到一段代码中是这样gc的:
while(true){
System.gc();
记录本次gc后的已使用堆内存;
if(最近10次的堆内存大小一样){
//说明gc已经达到最小值了,结束
if(gc次数&=){
//达到gc最大次数,结束
&2、其实不用纠结于堆内存是否被释放掉了,或者jvm占用的内存是否被释放掉了,托管给jvm自己去决策就可以。
gc需要占用cpu执行时间的,如果虚拟机认为堆内存足够使用的话,何必要gc呢?何况gc回收内存销毁对象之前,都会调用待回收对象的finallize方法,也会增加cpu开销。言而总之,gc并不能带来性能提升,相反会占用cpu,同时手工gc所谓的释放内存不能带来什么正面影响:jvm觉得内存不够的时候自然会gc。自动gc有点lazy的味道:只有需要的时候才会执行,或者延迟执行。
此外,gc仍然是jvm的内部功能,即使gc以后,回收回来的内存也不大会还给操作系统(具体说,有一个jvm参数决定空闲堆内存大于一定百分比时才会把内存还给操作系统,多数情况下这些内存仍然由jvm管理)。jvm和操作系统之间的通讯是比较昂贵的,向操作系统交还内存、申请内存都比较浪费时间。从另外一个角度看,如果jvm一有空闲内存就交给操作系统的话,那么必然的也会经常内存紧张,需要频繁的向操作系统申请内存。任务管理器中看到的就是jvm管理的内存+jvm自身占用的内存。
java和.net的托管代码类似,都是虚拟机向操作系统申请一大块内存后,自己管理,从而避免频繁的操作系统调用,并且能使用适合自身应用场景的、特殊的内存管理方式来提高性能。
例如& 操作系统提供的文件系统通常都是& 通用目的 &的,并不一定是最适合数据库文件、数据库索引、B-tree的文件系统。 因此oracle数据库通常会自己向操作系统申请一大块存储空间后,使用专门针对数据库优化的方式使用这块磁盘空间。这种时候我个人以为没有必要去纠结于oracle是如何使用这块磁盘的(类似于jvm是如何使用这块内存的),为啥没有及时释放空闲资源。只要jvm足够快,能够买足我的要求就可以了。
3、如果楼主确实需要降低jvm占用的内存,可以试试看虚拟机的那些-X和-XX参数,-Xmx参数能够强制性的限制jvm堆内存的最大值。-X和-XX的参数都是非官方/非标准的参数,某些会直接影响虚拟机的性能,甚至虚拟机的稳定性,慎用。
<span class="a_vote_num" id="a_vote_num_
我认为这是一个误区,调用GC方法并不能解决问题,内存释放可以通过调优JVM来加速NEW和OLD代的回收频率——根据自己的实际情况。 这一切都交给JVM自动来打理!
<span class="a_vote_num" id="a_vote_num_
引用来自“liuex”的答案1、执行1次gc可能不够,我看到一段代码中是这样gc的:
while(true){
System.gc();
记录本次gc后的已使用堆内存;
if(最近10次的堆内存大小一样){
//说明gc已经达到最小值了,结束
if(gc次数&=){
//达到gc最大次数,结束
&2、其实不用纠结于堆内存是否被释放掉了,或者jvm占用的内存是否被释放掉了,托管给jvm自己去决策就可以。
gc需要占用cpu执行时间的,如果虚拟机认为堆内存足够使用的话,何必要gc呢?何况gc回收内存销毁对象之前,都会调用待回收对象的finallize方法,也会增加cpu开销。言而总之,gc并不能带来性能提升,相反会占用cpu,同时手工gc所谓的释放内存不能带来什么正面影响:jvm觉得内存不够的时候自然会gc。自动gc有点lazy的味道:只有需要的时候才会执行,或者延迟执行。
此外,gc仍然是jvm的内部功能,即使gc以后,回收回来的内存也不大会还给操作系统(具体说,有一个jvm参数决定空闲堆内存大于一定百分比时才会把内存还给操作系统,多数情况下这些内存仍然由jvm管理)。jvm和操作系统之间的通讯是比较昂贵的,向操作系统交还内存、申请内存都比较浪费时间。从另外一个角度看,如果jvm一有空闲内存就交给操作系统的话,那么必然的也会经常内存紧张,需要频繁的向操作系统申请内存。任务管理器中看到的就是jvm管理的内存+jvm自身占用的内存。
java和.net的托管代码类似,都是虚拟机向操作系统申请一大块内存后,自己管理,从而避免频繁的操作系统调用,并且能使用适合自身应用场景的、特殊的内存管理方式来提高性能。
例如& 操作系统提供的文件系统通常都是& 通用目的 &的,并不一定是最适合数据库文件、数据库索引、B-tree的文件系统。 因此oracle数据库通常会自己向操作系统申请一大块存储空间后,使用专门针对数据库优化的方式使用这块磁盘空间。这种时候我个人以为没有必要去纠结于oracle是如何使用这块磁盘的(类似于jvm是如何使用这块内存的),为啥没有及时释放空闲资源。只要jvm足够快,能够买足我的要求就可以了。
3、如果楼主确实需要降低jvm占用的内存,可以试试看虚拟机的那些-X和-XX参数,-Xmx参数能够强制性的限制jvm堆内存的最大值。-X和-XX的参数都是非官方/非标准的参数,某些会直接影响虚拟机的性能,甚至虚拟机的稳定性,慎用。了解,其实我个人也认为应该是jvm向os申请内存使用后就没有释放,直到jvm退出。谢谢回复
<span class="a_vote_num" id="a_vote_num_
引用来自“新人王”的答案我认为这是一个误区,调用GC方法并不能解决问题,内存释放可以通过调优JVM来加速NEW和OLD代的回收频率——根据自己的实际情况。 这一切都交给JVM自动来打理!是的,调用gc只是告诉jvm相应的对象所占内存可以被回收掉,至于jvm是否立即回收还是根本就不回收完全取决于jvm自身的机制。
更多开发者职位上
有什么技术问题吗?
kindcao...的其它问题
类似的话题基本数据的类型的大小是固定的,这里就不多说了。对于非基本类型的对象,其大小就&#20540;得商榷。
在Java中,一个空Object对象的大小是8byte,这个大小只是保存堆中一个没有任何属性的对象的大小。看下面语句:
Object ob =
new Object();
这样在程序中完成了一个Java对象的生命,但是它所占的空间为:4byte&#43;8byte。4byte是上面部分所说的Java栈中保存引用的所需要的空间。而那8byte则是Java堆中对象的信息。因为所有的Java非基本类型的对象都需要默认继承Object对象,因此不论什么样的Java对象,其大小都必须是大于8byte。
有了Object对象的大小,我们就可以计算其他对象的大小了。
NewObject {
其大小为:空对象大小(8byte)&#43;int大小(4byte)&#43;Boolean大小(1byte)&#43;空Object引用的大小(4byte)=17byte。但是因为Java在对对象内存分配时都是以8的整数倍来分,因此大于17byte的最接近8的整数倍的是24,因此此对象的大小为24byte。
这里需要注意一下基本类型的包装类型的大小。因为这种包装类型已经成为对象了,因此需要把他们作为对象来看待。包装类型的大小至少是12byte(声明一个空Object至少需要的空间),而且12byte没有包含任何有效信息,同时,因为Java对象大小是8的整数倍,因此一个基本类型包装类的大小至少是16byte。这个内存占用是很恐怖的,它是使用基本类型的N倍(N&2),有些类型的内存占用更是夸张(随便想下就知道了)。因此,可能的话应尽量少使用包装类。在JDK5.0以后,因为加入了自动类型装换,因此,Java虚拟机会在存储方面进行相应的优化。
对象引用类型分为强引用、软引用、弱引用和虚引用。
强引用:就是我们一般声明对象是时虚拟机生成的引用,强引用环境下,垃圾回收时需要严&#26684;判断当前对象是否被强引用,如果被强引用,则不会被垃圾回收
软引用:软引用一般被做为缓存来使用。与强引用的区别是,软引用在垃圾回收时,虚拟机会根据当前系统的剩余内存来决定是否对软引用进行回收。如果剩余内存比较紧张,则虚拟机会回收软引用所引用的空间;如果剩余内存相对富裕,则不会进行回收。换句话说,虚拟机在发生OutOfMemory时,肯定是没有软引用存在的。
弱引用:弱引用与软引用类&#20284;,都是作为缓存来使用。但与软引用不同,弱引用在进行垃圾回收时,是一定会被回收掉的,因此其生命周期只存在于一个垃圾回收周期内。
强引用不用说,我们系统一般在使用时都是用的强引用。而“软引用”和“弱引用”比较少见。他们一般被作为缓存使用,而且一般是在内存大小比较受限的情况下做为缓存。因为如果内存足够大的话,可以直接使用强引用作为缓存即可,同时可控性更高。因而,他们常见的是被使用在桌面应用系统的缓存。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1932次
排名:千里之外
转载:52篇
(44)(12)(1)来问个关于null是否占用内存空间的问题_java吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:537,959贴子:
来问个关于null是否占用内存空间的问题收藏
想问问各位大神,null会占用内存空间吗?比如Object obj =
这时的obj是否占用内存空间呢?
占用的话,占用的是null的空间?占用了多少空间呢?不占用的话,指向引用时,存储的引用地址又存在哪里的呢?
java上海北大青鸟于达校区专注java,免试入学,专科保底,学历+技能,包就业!喜迎新春,更有一大拨免费试听课程来袭,点击预约试听名额~北大青鸟于达校区
不是会被回收么?
这时,obj就被自动回收了
等於NULL時,只佔用指針地址。至於指針存在哪里,如果是局部變量,存在方法栈上。全局变量存在方法区(有点不确定)
楼上说的对,并且如果没有在finalize()让它重活的话,那么会在垃圾回收的时候会回收掉
如果是刚创建时,占一个 栈空间
位置,栈空间都是 地址指针,一般为long
8个字节。指向堆空间的一个位置。
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或}

我要回帖

更多关于 重装系统后内存占用高 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信