当前位置:编程学习 > JAVA >>

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

写一个机器学习的程序,原先在2G内存的电脑上跑,设置-Xmx1300m,过会程序报错,内存不够用。
转到4G内存,设置-Xmx3500m,程序占用内存比在2G机器上增长的更快,很快逼近3500m,
之后就是频繁的内存换进换出,内存占用高,CPU占用很低,但是有时候会出现内存占用下降,CPU占用上升的情况,但是我的程序貌似没有在运行。
能能解释一下红色字出现的原因啊。
第一个我不知道为什么,第二个我猜测会不会是java虚拟机在清理内存? --------------------编程问答-------------------- 这种情况可能是不是你程序里有问题 --------------------编程问答-------------------- 是的,在默认情况下,java的垃圾回收器会在你的堆内存逼近最大值的时候停掉用户的线程去执行垃圾回收,因此,你设置成了3500,内存就不一直增长到3500,等到内存占用3500的时候执行垃圾回收。你的内存设置得越大,那么执行垃圾回收的资源消耗也就越大了 --------------------编程问答-------------------- "内存占用下降,CPU占用上升"的情况可能就是 GC在工作了。
另外,“内存换进换出”是正常现象,现代操作系统都是这么设计的。

这种代码内存多很正常,向量就是多,所以内存就是占用很庞大。 --------------------编程问答-------------------- 好像似的,.. --------------------编程问答-------------------- 推荐一下看看有没有其他的分析 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 程序拿来瞧瞧不? --------------------编程问答-------------------- 程序占用内存比在2G机器上增长的更快,很快逼近3500m。
=======
我以前4G内存,用半小时一般3.5G就没了。
换到8G,一个小时多点7G就没了。。。。。。 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 主动的将程序不用的对象设为空不知道会不会降低内存使用
机器学习本来就是费时间费内存的东东 --------------------编程问答-------------------- 主动的将程序不用的对象设为空不知道会不会降低内存使用 --------------------编程问答-------------------- 这种情况应该是有太多的缺页中断,操作系统在频繁的进行页面换进换出,发生了页面的颠簸,或者叫抖动,解决办法一是关闭不必要的进程来增加可用页面数,或者增加内存容量,或者是改善程序的工作方式,很多时候是多维数组循环迭代的引起过多的缺页中断,改变迭代的顺序,尽量使内部循环按内存地址迭代,就能大大减少缺页中断的发生。 --------------------编程问答-------------------- 主动将程序不用的对象设为空不知道会不会对内存使用有影响吗 --------------------编程问答-------------------- 这个貌似比较高深,可能需要专业的来 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- --------------------编程问答-------------------- Java的内存分配有三种, 
1、静态存储区:内存在程序编译时就分配好了,比如静态变量; 
2、栈区:各种原始数据类型的局部变量都是在栈上创建的,当程序退出该变量的作用范围的时候,这个变量的内存会被自动释放。 
3、堆区:对象(包括数组)都是在堆中创建的。程序在运行的时候用new关键字来创建对象,对象创建时会在堆中为其分配内存。 --------------------编程问答-------------------- 内存管理在java里占用内存的就4个模块  栈,堆,静态区,代码区。经常用到的也就是栈区和堆区。 --------------------编程问答-------------------- 一些在堆区的new 对象也要通过在栈区的引用来访问堆区主要用到的就这2快 --------------------编程问答-------------------- 很大程序上应该是你的程序问题,内存一般不会跑那么高,很可能是你隐性的一直在开辟新内存! --------------------编程问答-------------------- 我就知道ios的内存管理机制,谁创建,谁释放, --------------------编程问答-------------------- 你那个机器学习程序 肯定是一个极耗内存的程序,不断的创建对象。当JVM的内存被你用光的时候,JVM请求系统要更多内存又不得,就会抛OutOfMemoryError( 是这么拼的吧),而你第二次把JVM的内存设大,没抛异常,并且当内存占用下降而CPU升高,我猜想应该是GC 这时候在发挥作用了,GC 回收内存要运算,标记-清除,复制,新-旧移动 等等一系列的算法,是要消耗资源的。GC回收内存一般是在程序线程空闲或者是JVM不够用的时候发生的,并且回收的时候程序线程是被挂起状态的,也就是休眠,这么做也是防止并发的发生对程序线程产生影响 --------------------编程问答-------------------- JAVA有办法控制对象是在栈还是堆么?  --------------------编程问答--------------------
为啥要用java来写机器学习的程序啊?通常不是都用的C/C++么? --------------------编程问答-------------------- 感觉还是很不可信任啊 --------------------编程问答-------------------- java内存管理的确有点不靠谱 --------------------编程问答-------------------- BUQINGCHU --------------------编程问答-------------------- 除 --------------------编程问答-------------------- http://blog.jobbole.com/37273/ --------------------编程问答-------------------- 比较高深。。。。 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 完全没看懂。。。 --------------------编程问答-------------------- Java的内存分配有三种, 
1、静态存储区:内存在程序编译时就分配好了,比如静态变量; 
2、栈区:各种原始数据类型的局部变量都是在栈上创建的,当程序退出该变量的作用范围的时候,这个变量的内存会被自动释放。 
3、堆区:对象(包括数组)都是在堆中创建的。程序在运行的时候用new关键字来创建对象,对象创建时会在堆中为其分配内存。 --------------------编程问答-------------------- 内存占用下降,CPU占用上升"的情况可能就是 GC在工作了。
 另外,“内存换进换出”是正常现象,现代操作系统都是这么设计的。

 这种代码内存多很正常,向量就是多,所以内存就是占用很庞大。 --------------------编程问答-------------------- 好高端,学习中 --------------------编程问答-------------------- 这时候一般要分析java线程转储来找到引起系统减速或者挂起的原因,可以利用一些轻量级的工具。 --------------------编程问答-------------------- 程序占用内存比在2G机器上增长的更快,很快逼近3500m。
=======
我以前4G内存,用半小时一般3.5G就没了。
换到8G, --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 这我觉得你要检查一下你的程序。 --------------------编程问答-------------------- 1、静态存储区:内存在程序编译时就分配好了,比如静态变量; 2、栈区:各种原始数据类型的局部变量都是在栈上创建的,当程序退出该变量的作用范围的时候,这个变量的内存会被自动释放。 3、堆区:对象(包括数组)都是在堆中创建的。程序在运行的时候用new关键字来创建对象,对象创建时会在堆中为其分配内存。 --------------------编程问答-------------------- --------------------编程问答-------------------- 比较高深... --------------------编程问答-------------------- 我是来学习的,正在学习中。 --------------------编程问答-------------------- 不错;;;;;;; --------------------编程问答-------------------- 不错,非常好 --------------------编程问答-------------------- 代码都干了些什么工作占了这么多内存? --------------------编程问答-------------------- 代码都干了些什么工作占了这么多内存 --------------------编程问答-------------------- 也是正在学习中、、 --------------------编程问答-------------------- 我也是来学习的 --------------------编程问答-------------------- 还行  可以参考 --------------------编程问答-------------------- 内存占用过多时,可以用JVM自带工具分析:http://blog.sina.com.cn/s/blog_56fd58ab0100wga0.html可以看看是什么对象占用内存过多,一般在新生代很少,主要是在老年带和持久代;而你CPU过高,可能是你机器计算语言代码写的有问题,好好检查下。 --------------------编程问答-------------------- 你这个现象正常。
JVM 在2G内存以下,默认跑client模式,对内存使用短地址(我记得是),用内存用的比较节约,GC较多。
而在2G以上默认是server模式,对内存使用长地址,代码激进优化,用内存用的比较铺张。容易很长时间不GC,然后一下子发动一个长时间GC。

这只是一般说说,JVM的行为更多和你本身代码和算法有关。没代码不太好分析。
dump出来再分析在一定程度上可行,但是我个人觉得不如审查代码来分析省力。 --------------------编程问答-------------------- Java的内存分配有三种, 
1、静态存储区:内存在程序编译时就分配好了,比如静态变量; 
2、栈区:各种原始数据类型的局部变量都是在栈上创建的,当程序退出该变量的作用范围的时候,这个变量的内存会被自动释放。 
3、堆区:对象(包括数组)都是在堆中创建的。程序在运行的时候用new关键字来创建对象,对象创建时会在堆中为其分配内存。 --------------------编程问答-------------------- 学习了; --------------------编程问答-------------------- 参考http://blog.jobbole.com/22909/ --------------------编程问答-------------------- 不懂,路过,学习了。看了之后,觉得差距真大....
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,