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

- 22,460
- 3
- 73
- 80
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.

- 8,135
- 1
- 25
- 28