Подтвердить что ты не робот

Все возможные значения os.arch в 32bit JRE и в 64bit Jre

Мне нужна последняя компиляция всех возможных значений свойства os.arch в JRE 1.6 на Linux, Solaris и Windows. Если возможно, укажите источник ваших результатов. Мне нужны эти значения для выбора ресурсов в моем файле JNLP. В основном мне нужно назначить другую JVM-память на основе того, является ли JRE 32-битным или 64-битным. В ожидании вашего ответа. Благодаря

4b9b3361

Ответ 1

Вы также можете написать код, как показано ниже, чтобы узнать os и его archi.

import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang.SystemUtils;


public class PlatformDetection {
    private String os;
    private String arch;
    public static String OS_WINDOWS = "windows";
    public static String OS_OSX = "osx";
    public static String OS_SOLARIS = "solaris";
    public static String OS_LINUX = "linux";
    public static String ARCH_PPC = "ppc";
    public static String ARCH_X86_32 = "x86_32";
    public static String ARCH_X86_64 = "x86_64";

    public PlatformDetection() {
        // resolve OS
        if (SystemUtils.IS_OS_WINDOWS) {
            this.os = OS_WINDOWS;
        } else if (SystemUtils.IS_OS_MAC_OSX) {
            this.os = OS_OSX;
        } else if (SystemUtils.IS_OS_SOLARIS) {
            this.os = OS_SOLARIS;
        } else if (SystemUtils.IS_OS_LINUX) {
            this.os = OS_LINUX;
        } else {
            throw new IllegalArgumentException("Unknown operating system " + SystemUtils.OS_NAME);
        }

        // resolve architecture
        Map<String, String> archMap = new HashMap<String, String>();
        archMap.put("x86", ARCH_X86_32);
        archMap.put("i386", ARCH_X86_32);
        archMap.put("i486", ARCH_X86_32);
        archMap.put("i586", ARCH_X86_32);
        archMap.put("i686", ARCH_X86_32);
        archMap.put("x86_64", ARCH_X86_64);
        archMap.put("amd64", ARCH_X86_64);
        archMap.put("powerpc", ARCH_PPC);
        this.arch = archMap.get(SystemUtils.OS_ARCH);
        if (this.arch == null) {
            throw new IllegalArgumentException("Unknown architecture " + SystemUtils.OS_ARCH);
        }
    }

    public String getOs() {
        return os;
    }

    public String getArch() {
        return arch;
    }

    public void setArch(String arch) {
        this.arch = arch;
    }

    public void setOs(String os) {
        this.os = os;
    }

    public String toString() {

        return os + "_" + arch;
    }
}

См. ниже Ссылки

Ответ 2

Лучшее место, где вы можете найти это в собственном jdk.

В окне java.lang.System вы можете увидеть, что свойства инициализируются методом initializeSystemClass, используя метод initProperties, который использует собственный код с помощью JNI:

private static native Properties initProperties(Properties props);

/**
 * Initialize the system class.  Called after thread initialization.
 */
private static void initializeSystemClass() {

    // VM might invoke JNU_NewStringPlatform() to set those encoding
    // sensitive properties (user.home, user.name, boot.class.path, etc.)
    // during "props" initialization, in which it may need access, via
    // System.getProperty(), to the related system encoding property that
    // have been initialized (put into "props") at early stage of the
    // initialization. So make sure the "props" is available at the
    // very beginning of the initialization and all system properties to
    // be put into it directly.
    props = new Properties();
    initProperties(props);  // initialized by the VM
    ...
    ...
}

Если вы проверяете источник этого родного кода с initProperties для разных платформ, вы можете увидеть возможные значения для системного свойства os.arch. Сделайте это шаг за шагом:

Сначала посмотрите System.c, чтобы увидеть метод JNI, вызванный из java.lang.System.initProperties. Из System.c

JNIEXPORT jobject JNICALL
Java_java_lang_System_initProperties(JNIEnv *env, jclass cla, jobject props)
{
    char buf[128];
    java_props_t *sprops = GetJavaProperties(env);
    jmethodID putID = (*env)->GetMethodID(env,
                                          (*env)->GetObjectClass(env, props),
                                          "put",
            "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");

    if (sprops == NULL || putID == NULL ) return NULL;

    PUTPROP(props, "java.specification.version",
            JDK_MAJOR_VERSION "." JDK_MINOR_VERSION);
    PUTPROP(props, "java.specification.name",
            "Java Platform API Specification");
    PUTPROP(props, "java.specification.vendor", "Sun Microsystems Inc.");

    PUTPROP(props, "java.version", RELEASE);
    PUTPROP(props, "java.vendor", VENDOR);
    PUTPROP(props, "java.vendor.url", VENDOR_URL);
    PUTPROP(props, "java.vendor.url.bug", VENDOR_URL_BUG);

    ...

    /* os properties */
    PUTPROP(props, "os.name", sprops->os_name);
    PUTPROP(props, "os.version", sprops->os_version);

    // HERE IS THE `os.arch` PROPERTY :)

    PUTPROP(props, "os.arch", sprops->os_arch);

Итак, вы можете видеть, что os.arch происходит от PUTPROP(props, "os.arch", sprops->os_arch); и sprops, достигнутого с помощью java_props_t *sprops = GetJavaProperties(env);. поэтому рассмотрим GetJavaProperties(env), этот метод он определил в java_props.h как:

java_props_t *GetJavaProperties(JNIEnv *env);

И реализация кажется, что зависит от ОС.

Итак, наконец, посмотрим конкретную реализацию для GetJavaProperties; в Windows возможные значения, которые это свойство может принимать, это ia64, amd64, x86 или unknown. Вы можете видеть из java_props_md.c file:

#if _M_IA64
        sprops.os_arch = "ia64";
#elif _M_AMD64
        sprops.os_arch = "amd64";
#elif _X86_
        sprops.os_arch = "x86";
#else
        sprops.os_arch = "unknown";
#endif

Для Solaris кажется более сложным, так как значение свойства в собственном коде происходит из макроса, определенного в java_props_md.c для соляриев как:

sprops.os_arch = ARCHPROPNAME;

И этот макрос, определенный в следующем Makefile как:

OTHER_CPPFLAGS += -DARCHPROPNAME='"$(ARCHPROP)"'

Итак, похоже, что это происходит из среды, где она скомпилирована (извините, что я не эксперт C, я просто догадываюсь, что, возможно, я могу немного вас погулять).

В папке Linux в src/linux/native/ нет java_props_md.c, поэтому я предполагаю, что в этом случае возьмем тот же источник, что и Solaris (я снова предполагаю...).

ПРИМЕЧАНИЕ. Я использую версию 1.6 для получения этих значений, однако новые значения могут быть добавлены в новейшие версии Java, поэтому проверьте требуемую версию.

Надеюсь, что это поможет,