谁能说说java内存管理机制吗?

希望在哪 2013-11-26 06:42:29
加精
写一个机器学习的程序,原先在2G内存的电脑上跑,设置-Xmx1300m,过会程序报错,内存不够用。
转到4G内存,设置-Xmx3500m,程序占用内存比在2G机器上增长的更快,很快逼近3500m,
之后就是频繁的内存换进换出,内存占用高,CPU占用很低,但是有时候会出现内存占用下降,CPU占用上升的情况,但是我的程序貌似没有在运行
能能解释一下红色字出现的原因啊。
第一个我不知道为什么,第二个我猜测会不会是java虚拟机在清理内存?
...全文
4753 62 打赏 收藏 转发到动态 举报
写回复
用AI写文章
62 条回复
切换为时间正序
请发表友善的回复…
发表回复
一鹏 2015-09-23
  • 打赏
  • 举报
回复
好神秘啊,研究内存/...
ssqtom 2015-09-20
  • 打赏
  • 举报
回复
引用 13楼u012967461 的回复:
主动的将程序不用的对象设为空不知道会不会降低内存使用
主动将对象设置为Null,这个对象就会成为垃圾数据,到一定程度时,就会启动GC
ssqtom 2015-09-20
  • 打赏
  • 举报
回复
引用 15楼u012966974 的回复:
主动将程序不用的对象设为空不知道会不会对内存使用有影响吗
主动将对象设置为空,那么这个对象的数据成为垃圾数据吧,当垃圾数据到一定程度时,GC就会运行吧?
maoli2009 2013-12-03
  • 打赏
  • 举报
回复
不懂,路过,学习了。看了之后,觉得差距真大....
  • 打赏
  • 举报
回复
参考http://blog.jobbole.com/22909/
阿琛 2013-11-29
  • 打赏
  • 举报
回复
Java的内存分配有三种, 1、静态存储区:内存在程序编译时就分配好了,比如静态变量; 2、栈区:各种原始数据类型的局部变量都是在栈上创建的,当程序退出该变量的作用范围的时候,这个变量的内存会被自动释放。 3、堆区:对象(包括数组)都是在堆中创建的。程序在运行的时候用new关键字来创建对象,对象创建时会在堆中为其分配内存。
libaojun6 2013-11-29
  • 打赏
  • 举报
回复
学习了;
beowulf2005 2013-11-29
  • 打赏
  • 举报
回复
你这个现象正常。 JVM 在2G内存以下,默认跑client模式,对内存使用短地址(我记得是),用内存用的比较节约,GC较多。 而在2G以上默认是server模式,对内存使用长地址,代码激进优化,用内存用的比较铺张。容易很长时间不GC,然后一下子发动一个长时间GC。 这只是一般说说,JVM的行为更多和你本身代码和算法有关。没代码不太好分析。 dump出来再分析在一定程度上可行,但是我个人觉得不如审查代码来分析省力。
Luciferoffans 2013-11-29
  • 打赏
  • 举报
回复
内存占用过多时,可以用JVM自带工具分析:http://blog.sina.com.cn/s/blog_56fd58ab0100wga0.html可以看看是什么对象占用内存过多,一般在新生代很少,主要是在老年带和持久代;而你CPU过高,可能是你机器计算语言代码写的有问题,好好检查下。
裕灵Ling 2013-11-28
  • 打赏
  • 举报
回复
还行 可以参考
lxj2xz 2013-11-28
  • 打赏
  • 举报
回复
我也是来学习的
卟小佳 2013-11-28
  • 打赏
  • 举报
回复
也是正在学习中、、
shuiliuhualuo 2013-11-27
  • 打赏
  • 举报
回复
BUQINGCHU
yinan9 2013-11-27
  • 打赏
  • 举报
回复
java内存管理的确有点不靠谱
kity678 2013-11-27
  • 打赏
  • 举报
回复
代码都干了些什么工作占了这么多内存
nj_dobetter 2013-11-27
  • 打赏
  • 举报
回复
代码都干了些什么工作占了这么多内存?
chen870201 2013-11-27
  • 打赏
  • 举报
回复
感觉还是很不可信任啊
有点发红 2013-11-27
  • 打赏
  • 举报
回复
为啥要用java来写机器学习的程序啊?通常不是都用的C/C++么?
dfasri 2013-11-27
  • 打赏
  • 举报
回复
JAVA有办法控制对象是在栈还是堆么?
steenMan 2013-11-27
  • 打赏
  • 举报
回复
你那个机器学习程序 肯定是一个极耗内存的程序,不断的创建对象。当JVM的内存被你用光的时候,JVM请求系统要更多内存又不得,就会抛OutOfMemoryError( 是这么拼的吧),而你第二次把JVM的内存设大,没抛异常,并且当内存占用下降而CPU升高,我猜想应该是GC 这时候在发挥作用了,GC 回收内存要运算,标记-清除,复制,新-旧移动 等等一系列的算法,是要消耗资源的。GC回收内存一般是在程序线程空闲或者是JVM不够用的时候发生的,并且回收的时候程序线程是被挂起状态的,也就是休眠,这么做也是防止并发的发生对程序线程产生影响
加载更多回复(32)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧