免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3230 | 回复: 11
打印 上一主题 下一主题

请教一个java程序内存分配的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-04-25 13:06 |只看该作者 |倒序浏览
我的程序使用以下方式启动:

nohup java -Xms4m -Xmx16m -cp $HOME/lib/ 。。。

使用以上方式启动后,使用ps列出了多个线程,
不明白为什么ps会列出如此多的子进程

之后,我想查看我的程序当前所使用内存空间的情况
根据pid,打开 /proc/$pid/status文件
发现这里面显示的内存使用情况和我分配的有很大的差值
文件内容如下:

Name: java
State: S (sleeping)
Tgid: 30085
Pid: 30085
PPid: 1
TracerPid: 0
Uid: 1009 1009 1009 1009
Gid: 100 100 100 100
FDSize: 256 /FD的最大值?
Groups: 100
VmSize: 210520 kB //该进程总共所占的虚拟空间的总数
VmLck: 0 kB //锁定的进程虚拟空间数
VmRSS: 19836 kB //RSS空间
VmData: 155944 kB //DATA空间
VmStk: 2032 kB //栈空间
VmExe: 56 kB //TEXT空间
VmLib: 7040 kB //动态链接库空间
SigPnd: 0000000000000000//下边三项是pend, block, ignore的信号量的对应位
SigBlk: 0000000000000004
SigIgn: 8000000000000003
SigCgt: 1000000380005ccc
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000

因为单独有很多appliction启动,都有这种情况,所以占用了大量的内存,使用free命令发现cache怎么也不能释放
free
total used free shared buffers cached
Mem: 4011076 3601104 409972 0 320044 2351272
-/+ buffers/cache: 929788 3081288
Swap: 8251336 4964 8246372

请教一下这里的高手,已经检查了程序,资源释放这些问题都没有,就是不知道程序为什么占用这么多的内存

论坛徽章:
0
2 [报告]
发表于 2006-04-25 13:33 |只看该作者
java heap设为4-16M也太小了,估计jvm不接受这个选项,最后看下来也只用了200多M,应该不算多
cache不用担心,linux是会尽量用足内存的,何况你的内存有4g,free的有3g,没看出内存泄漏的痕迹

论坛徽章:
0
3 [报告]
发表于 2006-04-25 13:36 |只看该作者
这么简单的一个程序起了如下子进程
mmstest   7815 23097  1 13:36 pts/9    00:00:00 java -Xms1m -Xmx4m -cp .:/home/mmstest/lib/mysql-connector-java-3.0.7-stable-bin.jar TestMemoryAllocated
mmstest   7816  7815  0 13:36 pts/9    00:00:00 java -Xms1m -Xmx4m -cp .:/home/mmstest/lib/mysql-connector-java-3.0.7-stable-bin.jar TestMemoryAllocated
mmstest   7817  7816  0 13:36 pts/9    00:00:00 java -Xms1m -Xmx4m -cp .:/home/mmstest/lib/mysql-connector-java-3.0.7-stable-bin.jar TestMemoryAllocated
mmstest   7818  7816  0 13:36 pts/9    00:00:00 java -Xms1m -Xmx4m -cp .:/home/mmstest/lib/mysql-connector-java-3.0.7-stable-bin.jar TestMemoryAllocated
mmstest   7819  7816  0 13:36 pts/9    00:00:00 java -Xms1m -Xmx4m -cp .:/home/mmstest/lib/mysql-connector-java-3.0.7-stable-bin.jar TestMemoryAllocated
mmstest   7820  7816  0 13:36 pts/9    00:00:00 java -Xms1m -Xmx4m -cp .:/home/mmstest/lib/mysql-connector-java-3.0.7-stable-bin.jar TestMemoryAllocated
mmstest   7821  7816  0 13:36 pts/9    00:00:00 java -Xms1m -Xmx4m -cp .:/home/mmstest/lib/mysql-connector-java-3.0.7-stable-bin.jar TestMemoryAllocated
mmstest   7822  7816  0 13:36 pts/9    00:00:00 java -Xms1m -Xmx4m -cp .:/home/mmstest/lib/mysql-connector-java-3.0.7-stable-bin.jar TestMemoryAllocated
mmstest   7823  7816  0 13:36 pts/9    00:00:00 java -Xms1m -Xmx4m -cp .:/home/mmstest/lib/mysql-connector-java-3.0.7-stable-bin.jar TestMemoryAllocated
mmstest   7824  7816  0 13:36 pts/9    00:00:00 java -Xms1m -Xmx4m -cp .:/home/mmstest/lib/mysql-connector-java-3.0.7-stable-bin.jar TestMemoryAllocated
mmstest   7825  7816  0 13:36 pts/9    00:00:00 java -Xms1m -Xmx4m -cp .:/home/mmstest/lib/mysql-connector-java-3.0.7-stable-bin.jar TestMemoryAllocated
mmstest   7826  7816  0 13:36 pts/9    00:00:00 java -Xms1m -Xmx4m -cp .:/home/mmstest/lib/mysql-connector-java-3.0.7-stable-bin.jar TestMemoryAllocated
mmstest   7827  7816  0 13:36 pts/9    00:00:00 java -Xms1m -Xmx4m -cp .:/home/mmstest/lib/mysql-connector-java-3.0.7-stable-bin.jar TestMemoryAllocated
mmstest   7828  7816  0 13:36 pts/9    00:00:00 java -Xms1m -Xmx4m -cp .:/home/mmstest/lib/mysql-connector-java-3.0.7-stable-bin.jar TestMemoryAllocated
mmstest   7829  7816  0 13:36 pts/9    00:00:00 java -Xms1m -Xmx4m -cp .:/home/mmstest/lib/mysql-connector-java-3.0.7-stable-bin.jar TestMemoryAllocated

我觉得不正常,那就是说在linux上即使跑一个很简单的程序也要占用如此多的内存

我以前很少关注这个

无论是从进程数还是内存分配我觉得都不合理

我刚才试了不加-Xms1m -Xmx4m,发现和加上-Xms1m -Xmx4m差别不大

[ 本帖最后由 thehenry 于 2006-4-25 13:38 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2006-04-25 13:43 |只看该作者
你的程序是做什么呢,其实10几个线程很正常的,java什么都不干都会有3,4个线程。
-Xms -Xmx不是你想设为多少都可以的,太小的话java不会接受的

论坛徽章:
0
5 [报告]
发表于 2006-04-25 13:55 |只看该作者
原帖由 tinywind 于 2006-4-25 13:43 发表
你的程序是做什么呢,其实10几个线程很正常的,java什么都不干都会有3,4个线程。
-Xms -Xmx不是你想设为多少都可以的,太小的话java不会接受的


请教:
能否解一下,我上面的程序都有些什么线程
我就知道一个gc线程,一个主线程
还有其它的线程是做什么用?

论坛徽章:
0
6 [报告]
发表于 2006-04-25 14:03 |只看该作者
不列出代码我怎么知道呢

论坛徽章:
0
7 [报告]
发表于 2006-04-25 14:12 |只看该作者
其实代码很简单

代码如下:
import java.sql.*;

/**
* User: thehenry<BR>
* Date: 2006-4-24<BR>
* Time: 17:06:59<BR>
*/
public class TestMemoryAllocated{
    public void execute(){
        int i = 1;
        while(i <= 60){
            //executeQuery();
            i++;
            System.out.println("test index : " + i);
            try {
                Thread.sleep(1000 * 30);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }
    public static void main(String[] args){
        TestMemoryAllocated allocate = new TestMemoryAllocated();
        allocate.execute();
    }
}

论坛徽章:
0
8 [报告]
发表于 2006-04-25 21:09 |只看该作者
我不能具体说明每一个线程的作用,在jdb中能看到的有
main
Signal Dispatcher
Finalizer
Reference Handler
其他在jdb中看不到,能够想到的有gc,jit compiler,glibc本身的管理线程,这样看来10几个线程是基本的,用HelloWorld之类的例子也能看到这么多线程

论坛徽章:
0
9 [报告]
发表于 2006-04-27 21:06 |只看该作者
难道说随便写一个java程序跑在linux上都要起这么多线程,并要占用这么多内存

这个程序我在windows下跑了一下,进程只有一个,

线程我不知道怎么看,看了一下内存5M多一些。

我不明白这个问题是不是和操作系统平台及jdk有关?

请高手继续讲解 : )

论坛徽章:
0
10 [报告]
发表于 2006-05-08 12:59 |只看该作者
老问题 顶起来

请大家再讨论一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP