是的,在默认情况下,java的垃圾回收器会在你的堆内存逼近最大值的时候停掉用户的线程去执行垃圾回收,因此,你设置成了3500,内存就不一直增长到3500,等到内存占用3500的时候执行垃圾回收。你的内存设置得越大,那么执行垃圾回收的资源消耗也就越大了

解决方案 »

  1.   

    "内存占用下降,CPU占用上升"的情况可能就是 GC在工作了。
    另外,“内存换进换出”是正常现象,现代操作系统都是这么设计的。这种代码内存多很正常,向量就是多,所以内存就是占用很庞大。
      

  2.   

    程序占用内存比在2G机器上增长的更快,很快逼近3500m。
    =======
    我以前4G内存,用半小时一般3.5G就没了。
    换到8G,一个小时多点7G就没了
      

  3.   

    Java的内存分配有三种, 
    1、静态存储区:内存在程序编译时就分配好了,比如静态变量; 
    2、栈区:各种原始数据类型的局部变量都是在栈上创建的,当程序退出该变量的作用范围的时候,这个变量的内存会被自动释放。 
    3、堆区:对象(包括数组)都是在堆中创建的。程序在运行的时候用new关键字来创建对象,对象创建时会在堆中为其分配内存。
      

  4.   

    内存管理在java里占用内存的就4个模块  栈,堆,静态区,代码区。经常用到的也就是栈区和堆区。
      

  5.   

    一些在堆区的new 对象也要通过在栈区的引用来访问堆区主要用到的就这2快
      

  6.   

    我就知道ios的内存管理机制,谁创建,谁释放,
      

  7.   

    你那个机器学习程序 肯定是一个极耗内存的程序,不断的创建对象。当JVM的内存被你用光的时候,JVM请求系统要更多内存又不得,就会抛OutOfMemoryError( 是这么拼的吧),而你第二次把JVM的内存设大,没抛异常,并且当内存占用下降而CPU升高,我猜想应该是GC 这时候在发挥作用了,GC 回收内存要运算,标记-清除,复制,新-旧移动 等等一系列的算法,是要消耗资源的。GC回收内存一般是在程序线程空闲或者是JVM不够用的时候发生的,并且回收的时候程序线程是被挂起状态的,也就是休眠,这么做也是防止并发的发生对程序线程产生影响
      

  8.   

    JAVA有办法控制对象是在栈还是堆么? 
      

  9.   


    为啥要用java来写机器学习的程序啊?通常不是都用的C/C++么?
      

  10.   

    http://blog.jobbole.com/37273/
      

  11.   

    Java的内存分配有三种, 
    1、静态存储区:内存在程序编译时就分配好了,比如静态变量; 
    2、栈区:各种原始数据类型的局部变量都是在栈上创建的,当程序退出该变量的作用范围的时候,这个变量的内存会被自动释放。 
    3、堆区:对象(包括数组)都是在堆中创建的。程序在运行的时候用new关键字来创建对象,对象创建时会在堆中为其分配内存。
      

  12.   

    内存占用下降,CPU占用上升"的情况可能就是 GC在工作了。
     另外,“内存换进换出”是正常现象,现代操作系统都是这么设计的。 这种代码内存多很正常,向量就是多,所以内存就是占用很庞大。
      

  13.   

    这时候一般要分析java线程转储来找到引起系统减速或者挂起的原因,可以利用一些轻量级的工具。
      

  14.   

    程序占用内存比在2G机器上增长的更快,很快逼近3500m。
    =======
    我以前4G内存,用半小时一般3.5G就没了。
    换到8G,
      

  15.   

    1、静态存储区:内存在程序编译时就分配好了,比如静态变量; 2、栈区:各种原始数据类型的局部变量都是在栈上创建的,当程序退出该变量的作用范围的时候,这个变量的内存会被自动释放。 3、堆区:对象(包括数组)都是在堆中创建的。程序在运行的时候用new关键字来创建对象,对象创建时会在堆中为其分配内存。