VB.netでメモリ解放アプリ

VB.netでメモリ解放アプリを作った。実際はこんなもの使う必要ないのだが、VB.netをまともに使ったことが無かったし、64ビット版Windowsでもこんなものの効果あるのか試したかった。Windows95の時代だってこの手のアプリは使う必要なんて全くなかった。それでもいまだに山ほど出てるし、さらにスマホ版も山ほど出ている。 世の中のシッタカちゃん達は物理メモリの空きにうるさいのだ。

※どうしてもこの操作を行いたいならWindowsならWindows2003リソースキットツールのempty.exeを使うのが一番安全だと思う。

主要な処理はVBでAPIを使わずに組めるってところがポイント。APIを使わないのでメモリ確保量は手動で指定。

Module Module1
    Class Mem1GB
        Const MemSize As Int32 = 26214400  '一度に確保するメモリ量(1GB=268435456,100MB=26214400) 1GB = 1024[Bytes]*1024[k]*1024[M] / 4[Bytes/Int32] 

        Dim Mem() As Int32
        Public Sub New()
            ReDim Mem(MemSize)
            Dim I As Long
            For I = 0 To MemSize - 1 Step 1024  '物理メモリを使用するため、1ページごと1個だけ値を書いてアクセスする 1Page = 4kB = 4*1024 / 4[Bytes/Int32]
                Mem(I) = I
            Next
        End Sub

        Protected Overrides Sub Finalize()
            ReDim Mem(0)
            System.GC.Collect()
        End Sub

        Public Function Check() As Boolean
            Check = False

            Dim N As Int32 = Int(Rnd() * Mem.Length / 1024) * 1024
            If N = Mem(N) Then
                Check = True
            Else
                System.Console.WriteLine("Check({0}) = {1} : NG.", N, Mem(N))
            End If

        End Function

    End Class

    Sub Main()
        Dim AllocSize As Long = 20
        If Environment.GetCommandLineArgs.Length >= 2 Then
            AllocSize = Environment.GetCommandLineArgs(1)
        End If


        System.Console.WriteLine("Allocate {0}GB", AllocSize / 10)

        Dim NewMem() As Mem1GB
        ReDim NewMem(AllocSize)   ' 100MB単位
        For Itr = 0 To NewMem.Length - 1
            NewMem(Itr) = New Mem1GB()
        Next

        System.Console.WriteLine("Memory allocated.")

        For Each Itr In NewMem
            If Itr.Check() = False Then
                System.Console.WriteLine("Memory read error.")
                System.Console.ReadKey()
            End If
        Next

        System.Console.WriteLine("Checking Done.")

        For Itr = 0 To NewMem.Length - 1
            NewMem(Itr) = Nothing
        Next
        System.GC.Collect()

        System.Console.WriteLine("Garbage collection Done.")
    End Sub

End Module

WordPressで崩れるため<、>、;は全角に置換。VS2019とかのVB.netコンパイラでx64アプリとしてビルドする。32ビット環境で使うならx86でも良い。

コマンドプロンプトで確保したいメモリの100MB単位の量を引数に指定して実行。未指定だと2GB確保する。次の例は15GBのメモリを確保する。

VBNewMem 150

タスクマネージャーの「利用可能」の値より少し少なめを指定するのが一番効率が良い。どのくらい少なくするかは環境依存。多すぎるとスラッシングしまくりでなかなか終わらない。

タスクマネージャーで見ながら動かすとどういう動きをするかがわかる。 大量のメモリを確保して、解放するだけ。キャッシュ部分が破棄されて物理メモリに空きができるという仕組み。大半のキャッシュは読み取り済みキャッシュなのですぐに破棄される。書き込み待ちキャッシュはディスクに書き出さないといけないのでおそらく終盤でイヤイヤ吐き出されるのだと思う。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中