4

Is it possible to get virtual memory page size of the OS on which a java application is running as a java int variable? If yes, how?

Qualphey
  • 1,244
  • 1
  • 19
  • 44
  • There is no guarantee that you actually have virtual memory in your system, So I believe this is platform-and-os-dependent. What OS are you working on? Come to think about it, perhaps it is undefined - you can have several different sizes on one system. – Elazar Sep 27 '13 at 09:44
  • I'm working on Ubuntu. In the accepted answer of this question: http://stackoverflow.com/questions/15923075/the-best-way-to-use-vbos it is mentioned that "if you want to use glMapBuffer making the buffer object a multiple of the host page size is very nice to the whole system". So that's why I want to get it. If java can't get it, then I'll just set it to 4kiB. – Qualphey Sep 27 '13 at 10:07
  • On x86/Linux, using 4KB sounds like a sure bet. – Elazar Sep 27 '13 at 10:10

2 Answers2

5

It is possible using undocumented APIs. sun.misc.Unsafe has a method pageSize() which according to the documentation:

Report the size in bytes of a native memory page (whatever that is). This value will always be a power of two.

Sample code:

import java.lang.reflect.Field;

import sun.misc.Unsafe;

public class PageInfo
{
    public static void main(String... args)
    throws Exception
    {
        Field f = Unsafe.class.getDeclaredField("theUnsafe");
        f.setAccessible(true);
        Unsafe unsafe = (Unsafe)f.get(null);

        int pageSize = unsafe.pageSize();
        System.out.println("Page size: " + pageSize);
    }
}

Be aware that sun.misc.Unsafe is undocumented, unsupported and may change with later releases of JDK. My suggestion, if you need to get page size info and want to use Unsafe, is to use it exists but fall-back to a sensible default (e.g. 4K) if needed (e.g. if the class or method no longer exists).

prunge
  • 22,460
  • 3
  • 73
  • 80
-3

See the following class; you can get an instance with getRuntime() -> http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html

EDIT: As has been suggested in the comments, I should provide more details on where to go from there. You'd need to run a couple different scripts for different OS-es; you can get the type by using System.getProperty().

You can find sample scripts by googling for "[os] + [memory page size] + script".

Note this would be a rather chippy solution, and I'm not saying it's nice, just that it's possible.

ALSO: Another idea I got when I googled this (though I'm not sure if this will work, as I've not done it) is to get the C code from the Wikipedia page on pages and import it as native java.

blgt
  • 8,135
  • 1
  • 25
  • 28