/* * Copyright (c) 2009-2015 * IT-Consulting Stephan Schloepke (http://www.schloepke.de/) * klemm software consulting Mirko Klemm (http://www.klemm-scs.com/) * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package org.jbasics.arch; import org.jbasics.annotation.ImmutableState; import org.jbasics.annotation.ThreadSafe; /** * A simple helper to try and determine if the underlying JVM is a 32 bit or a 64 bit one. * <p> * It is wise to never depend on the underlying JVM architecture. However in some cases it is easier to have an * algorithm written based on Integers rather than using Longs when you are running on a 32 bit JVM. For such cases * this is a way to determine what JVM we are running on. * </p><p> * It should be noted however that currently the detection is not quite perfect. It will work fine on all SUN * JVMs or derived ones (Mac OS X JVM for example). In cases that the system property "sun.arch.data.model" is * not set we look at the JVM Name and only consider the JVM as beeing 64 bit if a 64 is contained in the name * somewhere. * </p> * * @author Stephan Schloepke * @since 1.0 */ @ThreadSafe @ImmutableState public final class ArithmeticArchitecture { /** * The number used as data model to check for 64 bit architecture. */ public static final String NUMBER_64 = "64"; //$NON-NLS-1$ /** * The property of the JVM name used to figure out if the JVM is a 64 bit runtime. */ public static final String JAVA_VM_NAME_PROPERTY = "java.vm.name"; //$NON-NLS-1$ /** * Property for SUN/Oracle JVM holding the data model architecture. */ public static final String SUN_ARCH_DATA_MODEL_PROPERTY = "sun.arch.data.model"; //$NON-NLS-1$ /** * True if the JVM is a 64bit JVM. */ public static final boolean JVM64BIT; static { boolean env64bit = false; final String dataModel = System.getProperty(ArithmeticArchitecture.SUN_ARCH_DATA_MODEL_PROPERTY); if (dataModel != null) { env64bit = ArithmeticArchitecture.NUMBER_64.equals(dataModel); } else { // Ok we need to figure out maybe based on the name final String jvmName = System.getProperty(ArithmeticArchitecture.JAVA_VM_NAME_PROPERTY); if (jvmName != null) { env64bit = jvmName.contains(ArithmeticArchitecture.NUMBER_64); } } JVM64BIT = env64bit; } /** * Private constructor to hinder instantiation. */ private ArithmeticArchitecture() { // To hinder anyone to instantiate this type. } /** * Returns true if the architecture uses 32 bit integer arithmetic. * * @return True if the architecture uses 32 bit integer arithmetic. * * @since 1.0 */ public static boolean is32Bit() { return !ArithmeticArchitecture.JVM64BIT; } /** * Returns true if the architecture uses 64 bit integer arithmetic. * * @return True if the architecture uses 64 bit integer arithmetic. * * @since 1.0 */ public static boolean is64Bit() { return ArithmeticArchitecture.JVM64BIT; } }