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?
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).
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.