Xamarin.Mac/アプリのメモリ使用量を取得する

提供: MonoBook
移動先: 案内検索

IOKitからSMCを制御するために「mach_task_self()」「task_info()」周りの使い方をググっていて拾った。

オリジナルはXamarin.iOSでのパフォーマンス測定目的らしいが、そのままコピペXamarin.Macでも問題なく動いている。 そんなことより「/Sysytem/Library/Framework」だけではなく「/usr/lib/system」の中にも色々と渋いライブラリがいっぱいあることを知ったことが収穫だ。

using System;
using System.Runtime.InteropServices;
using AppKit;

namespace MemoryInfo
{
    static class MainClass
    {
        public const int TASK_BASIC_INFO = 4;

        [StructLayout(LayoutKind.Sequential, Pack=1)]
        public struct TimeValue
        {
            public int Seconds;
            public int Microseconds;
        }

        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public struct TaskBasicInfo
        {
            public int SuspendCount;
            public uint VirtualSize;
            public uint ResidentSize;
            public TimeValue UserTime;
            public TimeValue SystemTime;
            public int Policy;
        }

        [DllImport("/usr/lib/system/libsystem_kernel.dylib", CallingConvention = CallingConvention.Cdecl)]
        public static extern uint mach_task_self();

        [DllImport("/usr/lib/system/libsystem_kernel.dylib", CallingConvention = CallingConvention.Cdecl)]
        public static extern int task_info(uint targetTaskID, int flavor, ref TaskBasicInfo taskInfo, ref int size);

        static void Main(string[] args)
        {
            NSApplication.Init();
            //NSApplication.Main(args);

            var taskInfo = new TaskBasicInfo();
            var taskid = mach_task_self();
            int size = Marshal.SizeOf(typeof(TaskBasicInfo));
            task_info(taskid, TASK_BASIC_INFO, ref taskInfo, ref size);

            Console.WriteLine(taskInfo);
        }
    }
}

関連項目[編集 | ソースを編集]

参考文献[編集 | ソースを編集]