哪位高手能说说java内存管理机制吗

谁能说说java内存管理机制吗?
写一个机器学习的程序,原先在2G内存的电脑上跑,设置-Xmx1300m,过会程序报错,内存不够用。
转到4G内存,设置-Xmx3500m,程序占用内存比在2G机器上增长的更快,很快逼近3500m,
之后就是频繁的内存换进换出,内存占用高,CPU占用很低,但是有时候会出现内存占用下降,CPU占用上升的情况,但是我的程序貌似没有在运行
能能解释一下红色字出现的原因啊。
第一个我不知道为什么,第二个我猜测会不会是java虚拟机在清理内存?
------解决思路----------------------
这种情况应该是有太多的缺页中断,操作系统在频繁的进行页面换进换出,发生了页面的颠簸,或者叫抖动,解决办法一是关闭不必要的进程来增加可用页面数,或者增加内存容量,或者是改善程序的工作方式,很多时候是多维数组循环迭代的引起过多的缺页中断,改变迭代的顺序,尽量使内部循环按内存地址迭代,就能大大减少缺页中断的发生。
------解决思路----------------------
Java的内存分配有三种, 
1、静态存储区:内存在程序编译时就分配好了,比如静态变量; 
2、栈区:各种原始数据类型的局部变量都是在栈上创建的,当程序退出该变量的作用范围的时候,这个变量的内存会被自动释放。 
3、堆区:对象(包括数组)都是在堆中创建的。程序在运行的时候用new关键字来创建对象,对象创建时会在堆中为其分配内存。
------解决思路----------------------
你那个机器学习程序 肯定是一个极耗内存的程序,不断的创建对象。当JVM的内存被你用光的时候,JVM请求系统要更多内存又不得,就会抛OutOfMemoryError( 是这么拼的吧),而你第二次把JVM的内存设大,没抛异常,并且当内存占用下降而CPU升高,我猜想应该是GC 这时候在发挥作用了,GC 回收内存要运算,标记-清除,复制,新-旧移动 等等一系列的算法,是要消耗资源的。GC回收内存一般是在程序线程空闲或者是JVM不够用的时候发生的,并且回收的时候程序线程是被挂起状态的,也就是休眠,这么做也是防止并发的发生对程序线程产生影响