【问题标题】:Memory usage of thread or process in JavaJava中线程或进程的内存使用情况
【发布时间】:2012-03-12 20:26:42
【问题描述】:

在我的应用程序中,我使用不受信任的代码运行了一些线程,因此我必须防止内存溢出。我有一个看门狗,它分析当前线程的时间(线程是串行调用的)。 但是我如何确定内存使用情况? 我只知道Runtime.totalMemory()的整个VM的内存使用情况? 如果有可能找出线程的使用情况,或者单个进程的使用情况,那就太好了。通过进程的内存使用情况,我无论如何都可以计算线程的使用情况。

【问题讨论】:

  • 根据定义,一个线程与进程中的其他线程共享相同的内存空间。你的问题没有多大意义。 JVM = 进程。 1 个进程有很多线程。
  • JVM = 进程,也就是说每个java进程都有自己的JVM?
  • 是的。当你启动java时,你启动了一个新的JVM。
  • 谢谢,我以为每个新进程都使用同一个JVM,但现在清楚了!
  • @Nicolas:不,不,他是说当你在一个新的 JVM 中启动一个 java 进程时,该进程启动的所有线程共享相同的内存空间。所有线程都有一个 JVM。

标签: java multithreading memory-management process


【解决方案1】:

由于执行 Java 程序的 JVM 是一个 Java 进程,因此您不必担心这一点。 JVM进程中所有线程共享相同的内存空间。

因此,依靠就足够了

【讨论】:

    【解决方案2】:

    Java 应用程序无法控制其线程使用的内存量或(或 CPU)量, 无论线程是在运行受信任的代码还是不受信任的代码。没有 API 可以做 这在当前一代 JVM 中。而且肯定没有 API 可以监控线程的内存使用情况。 (甚至不清楚这是一个有意义的概念……)

    你可以保证控制不受信任的Java代码的资源使用的唯一方法是在单独的JVM中运行代码,并使用操作系统级别的资源控制(如ulimit、nice、sigstop等)和“-Xmx " 来限制 JVM 的资源使用。


    不久前,Sun 制作了JSR 121 旨在解决这个问题。该 JSR 将允许将应用程序拆分为通过消息传递进行通信的部分(称为“隔离”),并为一个隔离提供监视和控制另一个隔离的能力。不幸的是,Isolate API 尚未在任何主流 JVM 中实现。

    【讨论】:

      【解决方案3】:

      您需要做的是在其自己的进程/JVM 中运行不受信任的代码。这可以使用 JNI 接口(如果您的操作系统允许的话)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-19
        • 2016-05-30
        • 1970-01-01
        • 2012-11-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多