2017-02-02 2 views
0

javaを使用して合計メモリのサイズを取得する標準的な方法はありますか?すべてのJVMでJavaメモリを使用するRAMメモリを取得する方法はありますか

私はstackoverflowの中に、この答えが見つかりました:
https://stackoverflow.com/a/4335461/5060185

をしかし、com.sun.*パッケージは、すべてのJVMでは使用できません。

+0

使用しているJVMのバージョンは? –

+0

@ShyamGhodasra、javaバージョン "1.8.0_60" –

+0

ここから少し助けを受けるかもしれません。http://stackoverflow.com/questions/32619229/unable-to-import-org-sun-management-operatingsystemmxbean-in-java-クラス –

答えて

1

次のヘルプが表示されますか?

Runtime runtime = Runtime.getRuntime(); 
int mb = 1024 * 1024; 
log.info("Heap utilization statistics [MB]\nUsed Memory: {}\nFree Memory: {}\nTotal Memory: {}\nMax Memory: {}", 
      (runtime.totalMemory() - runtime.freeMemory())/mb, runtime.freeMemory()/mb, 
      runtime.totalMemory()/mb, runtime.maxMemory()/mb); 
+0

@ anad1stを読むことができますが、このランタイムはJVMのメモリ情報を提供しますが、システムは提供しません –

0

は必ずProcessBuilderで(free -mのような)いくつかの適切な外部プログラムを実行し、その出力を解析することができます。 Javaはヒープを使用して動作するため、RAMの総容量を取得する仕組みはありません。それ以上のメモリを割り当てることはできません。そのため、Javaではヒープです。

0

残念ながら、標準APIにこのような機能はありません。しかし、あなたは明示的に非標準のパッケージを参照することなく、フェイルセーフな方法で拡張されたAPIを使用することができます。

public class PhysicalMemory { 
    public static void main(String[] args) { 
     String[] attr={ "TotalPhysicalMemorySize", "FreePhysicalMemorySize"}; 
     OperatingSystemMXBean op = ManagementFactory.getOperatingSystemMXBean(); 
     List<Attribute> al; 
     try { 
      al = ManagementFactory.getPlatformMBeanServer() 
            .getAttributes(op.getObjectName(), attr).asList(); 
     } catch (InstanceNotFoundException | ReflectionException ex) { 
      Logger.getLogger(PhysicalMemory.class.getName()).log(Level.SEVERE, null, ex); 
      al = Collections.emptyList(); 
     } 
     for(Attribute a: al) { 
      System.out.println(a.getName()+": "+a.getValue()); 
     } 
    } 
} 

、彼らが利用可能な場合、これは関係なく、どのようにまたはで、TotalPhysicalMemorySizeFreePhysicalMemorySize属性の値を出力しますどのパッケージが実装されているかを示します。これはJava 9でも動作し、Reflection経由でこれらのsun-packageにアクセスしようとしても拒否されます。

これらの属性を持たないJREでは、プラットフォームに依存しない方法では取得できませんが、少なくともこのコードはリンクエラーで救済されず、情報なしで進めることができます。

関連する問題