java.lang.System
Posted dearYou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java.lang.System相关的知识,希望对你有一定的参考价值。
System类构造函数由private修饰,不可以被实例化,加载时调用static代码块。
System类提供了标准输入输出流,错误输出流,获取外部属性和系统环境的方法,加载类库和文件的方法,快速copy数组的方法;其中out和err的类型是PrintStream
/** * The <code>System</code> class contains several useful class fields * and methods. It cannot be instantiated. * * <p>Among the facilities provided by the <code>System</code> class * are standard input, standard output, and error output streams; * access to externally defined properties and environment * variables; a means of loading files and libraries; and a utility * method for quickly copying a portion of an array. * * @author unascribed * @since JDK1.0 */ public final class System { /* register the natives via the static initializer. * * VM will invoke the initializeSystemClass method to complete * the initialization for this class separated from clinit. * Note that to use properties set by the VM, see the constraints * described in the initializeSystemClass method. */ private static native void registerNatives(); static { registerNatives(); } /** Don\'t let anyone instantiate this class */ private System() { }
System.exit(int),终止当前虚拟机的运行,什么叫做当前虚拟机呢?
public static void exit(int status) { Runtime.getRuntime().exit(status); }
如果在某个线程中调用了exit会怎样?下面的例子输出结果是hello,把子线程和主线程的内容交换也是一样的结果。就是说不管在哪个线程调用了exit,整个应用都退出了。
package com.ysdx.test; public class JavaTest { public static void main(String[] args) { Thread thread = new Thread(() -> { try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("hello!"); System.exit(1); }); thread.start(); try { Thread.sleep(3000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("Hello from main thread!"); } }
两个虚拟机之间是互不影响的
其中JavaTest1如下
public class JavaTest1 { public static void main(String[] args) { try { Thread.sleep(3000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("Hello from main thread!"); } }
---------------------
System中gc相关操作
/** * Runs the garbage collector. * <p> * Calling the <code>gc</code> method suggests that the Java Virtual * Machine expend effort toward recycling unused objects in order to * make the memory they currently occupy available for quick reuse. * When control returns from the method call, the Java Virtual * Machine has made a best effort to reclaim space from all discarded * objects. * <p> * The call <code>System.gc()</code> is effectively equivalent to the * call: * <blockquote><pre> * Runtime.getRuntime().gc() * </pre></blockquote> * * @see java.lang.Runtime#gc() */ public static void gc() { Runtime.getRuntime().gc(); } /** * Runs the finalization methods of any objects pending finalization. * <p> * Calling this method suggests that the Java Virtual Machine expend * effort toward running the <code>finalize</code> methods of objects * that have been found to be discarded but whose <code>finalize</code> * methods have not yet been run. When control returns from the * method call, the Java Virtual Machine has made a best effort to * complete all outstanding finalizations. * <p> * The call <code>System.runFinalization()</code> is effectively * equivalent to the call: * <blockquote><pre> * Runtime.getRuntime().runFinalization() * </pre></blockquote> * * @see java.lang.Runtime#runFinalization() */ public static void runFinalization() { Runtime.getRuntime().runFinalization(); }
顺便看一下Runtime,
即便不显示调用gc,JVM也会自动在一个单独的线程中执行recycling process;
即便不显示调用runFinalization,JVM也会自动在一个单独的线程中执行finalization process;
可以很明显的看出gc和runFinalization是不同的,一个叫做回收过程,一个叫做终结过程。
调用runFinalization后,终结过程会调用已经被废弃但是尚未调用其finalization方法的对象。
函数注释里的描述都使用了suggest和has made its best effort,可能这两个函数还有不足之处。
/** * Runs the garbage collector. * Calling this method suggests that the Java virtual machine expend * effort toward recycling unused objects in order to make the memory * they currently occupy available for quick reuse. When control * returns from the method call, the virtual machine has made * its best effort to recycle all discarded objects. * <p> * The name <code>gc</code> stands for "garbage * collector". The virtual machine performs this recycling * process automatically as needed, in a separate thread, even if the * <code>gc</code> method is not invoked explicitly. * <p> * The method {@link System#gc()} is the conventional and convenient * means of invoking this method. */ public native void gc(); /* Wormhole for calling java.lang.ref.Finalizer.runFinalization */ private static native void runFinalization0(); /** * Runs the finalization methods of any objects pending finalization. * Calling this method suggests that the Java virtual machine expend * effort toward running the <code>finalize</code> methods of objects * that have been found to be discarded but whose <code>finalize</code> * methods have not yet been run. When control returns from the * method call, the virtual machine has made a best effort to * complete all outstanding finalizations. * <p> * The virtual machine performs the finalization process * automatically as needed, in a separate thread, if the * <code>runFinalization</code> method is not invoked explicitly. * <p> * The method {@link System#runFinalization()} is the conventional * and convenient means of invoking this method. * * @see java.lang.Object#finalize() */ public void runFinalization() { runFinalization0(); }
System中获取系统变量的方法:
getenv(String name)返回跟name对应的变量值;
getenv(),这个函数返回一个不可修改的、包含系统变量名和对应值的map,这个map在ProcessEnvironment中声明:private static final Map<String,String> theUnmodifiableEnvironment;
public static String getenv(String name) { SecurityManager sm = getSecurityManager(); if (sm != null) { sm.checkPermission(new RuntimePermission("getenv."+name)); } return ProcessEnvironment.getenv(name); } public static java.util.Map<String,String> getenv() { SecurityManager sm = getSecurityManager(); if (sm != null) { sm.checkPermission(new RuntimePermission("getenv.*")); } return ProcessEnvironment.getenv(); }
System类关于系统属性的操作有get、set和clear方法,而Environment只有读取的函数。
environment是操作系统环境变量信息,property感觉更像是jvm相关参数。下面例子的输出结果是:
java.runtime.name = Java(TM) SE Runtime Environment sun.boot.library.path = C:\\Program Files\\Java\\jre1.8.0_121\\bin java.vm.version = 25.121-b13 java.vm.vendor = Oracle Corporation java.vendor.url = http://java.oracle.com/ path.separator = ; java.vm.name = Java HotSpot(TM) 64-Bit Server VM file.encoding.pkg = sun.io user.script = user.country = CN sun.java.launcher = SUN_STANDARD sun.os.patch.level = java.vm.specification.name = Java Virtual Machine Specification user.dir = F:\\CodingSource\\neon-workspace\\JavaSystem java.runtime.version = 1.8.0_121-b13 java.awt.graphicsenv = sun.awt.Win32GraphicsEnvironment java.endorsed.dirs = C:\\Program Files\\Java\\jre1.8.0_121\\lib\\endorsed os.arch = amd64 java.io.tmpdir = C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\ line.separator = java.vm.specification.vendor = Oracle Corporation user.variant = os.name = Windows 8 sun.jnu.encoding = GBK java.library.path = C:\\Program Files\\Java\\jre1.8.0_121\\bin;C:\\Windows\\Sun\\Java\\bin;C:\\Windows\\system32;C:\\Windows;C:/Program Files/Java/jre1.8.0_121/bin/server;C:/Program Files/Java/jre1.8.0_121/bin;C:/Program Files/Java/jre1.8.0_121/lib/amd64;E:\\CodingIDE\\Python36\\Scripts\\;E:\\CodingIDE\\Python36\\;E:\\CodingIDE\\DataBase\\oraclexe\\app\\oracle\\product\\11.2.0\\server\\bin;;C:\\ProgramData\\Oracle\\Java\\javapath;C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\Program Files\\Java\\jdk1.8.0_121\\bin;C:\\Program Files\\Java\\jdk1.8.0_121\\jre\\bin;E:\\CodingIDE\\DataBase\\mysql-5.7.17-winx64\\bin;E:\\CodingIDE\\eclipse-jee-neon-3-RC3-win32-x86_64\\eclipse;;. java.specification.name = Java Platform API Specification java.class.version = 52.0 sun.management.compiler = HotSpot 64-Bit Tiered Compilers os.version = 6.2 user.home = C:\\Users\\Administrator user.timezone = java.awt.printerjob = sun.awt.windows.WPrinterJob file.encoding = GBK java.specification.version = 1.8 user.name = Administrator java.class.path = F:\\CodingSource\\neon-workspace\\JavaSystem\\bin java.vm.specification.version = 1.8 sun.arch.data.model = 64 java.home = C:\\Program Files\\Java\\jre1.8.0_121 sun.java.command = com.ysdx.jsys.JavaSystem java.specification.vendor = Oracle Corporation user.language = zh awt.toolkit = sun.awt.windows.WToolkit java.vm.info = mixed mode java.version = 1.8.0_121 java.ext.dirs = C:\\Program Files\\Java\\jre1.8.0_121\\lib\\ext;C:\\Windows\\Sun\\Java\\lib\\ext sun.boot.class.path = C:\\Program Files\\Java\\jre1.8.0_121\\lib\\resources.jar;C:\\Program Files\\Java\\jre1.8.0_121\\lib\\rt.jar;C:\\Program Files\\Java\\jre1.8.0_121\\lib\\sunrsasign.jar;C:\\Program Files\\Java\\jre1.8.0_121\\lib\\jsse.jar;C:\\Program Files\\Java\\jre1.8.0_121\\lib\\jce.jar;C:\\Program Files\\Java\\jre1.8.0_121\\lib\\charsets.jar;C:\\Program Files\\Java\\jre1.8.0_121\\lib\\jfr.jar;C:\\Program Files\\Java\\jre1.8.0_121\\classes java.vendor = Oracle Corporation file.separator = \\ java.vendor.url.bug = http://bugreport.sun.com/bugreport/ sun.cpu.endian = little sun.io.unicode.encoding = UnicodeLittle sun.desktop = windows sun.cpu.isalist = amd64 ----------------------------------- USERDOMAIN_ROAMINGPROFILE=PC-201703120850 LOCALAPPDATA=C:\\Users\\Administrator\\AppData\\Local PROCESSOR_LEVEL=6 FP_NO_HOST_CHECK=NO USERDOMAIN=PC-201703120850 LOGONSERVER=\\\\PC-201703120850 JAVA_HOME=C:\\Program Files\\Java\\jdk1.8.0_121 SESSIONNAME=Console ALLUSERSPROFILE=C:\\ProgramData PROCESSOR_ARCHITECTURE=AMD64 PSModulePath=C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\Modules\\ #envTSLOGSHELLEXT3464=510784384 SystemDrive=C: =C:=C:\\ APPDATA=C:\\Users\\Administrator\\AppData\\Roaming USERNAME=Administrator ProgramFiles(x86)=C:\\Program Files (x86) VBOX_MSI_INSTALL_PATH=F:\\VirtualBox\\ CommonProgramFiles=C:\\Program Files\\Common Files Path=C:/Program Files/Java/jre1.8.0_121/bin/server;C:/Program Files/Java/jre1.8.0_121/bin;C:/Program Files/Java/jre1.8.0_121/lib/amd64;E:\\CodingIDE\\Python36\\Scripts\\;E:\\CodingIDE\\Python36\\;E:\\CodingIDE\\DataBase\\oraclexe\\app\\oracle\\product\\11.2.0\\server\\bin;;C:\\ProgramData\\Oracle\\Java\\javapath;C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\Program Files\\Java\\jdk1.8.0_121\\bin;C:\\Program Files\\Java\\jdk1.8.0_121\\jre\\bin;E:\\CodingIDE\\DataBase\\mysql-5.7.17-winx64\\bin;E:\\CodingIDE\\eclipse-jee-neon-3-RC3-win32-x86_64\\eclipse; PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW OS=Windows_NT COMPUTERNAME=PC-201703120850 PROCESSOR_REVISION=3a09 CommonProgramW6432=C:\\Program Files\\Common Files #envTSLOGsss3464=166647136 ComSpec=C:\\Windows\\system32\\cmd.exe #envTSLOGXMediaLibrary3464=166645216 ProgramData=C:\\ProgramData =F:=F:\\ ProgramW6432=C:\\Program Files HOMEPATH=\\Users\\Administrator SystemRoot=C:\\Windows TEMP=C:\\Users\\ADMINI~1\\AppData\\Local\\Temp HOMEDRIVE=C: PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 58 Stepping 9, GenuineIntel USERPROFILE=C:\\Users\\Administrator TMP=C:\\Users\\ADMINI~1\\AppData\\Local\\Temp CommonProgramFiles(x86)=C:\\Program Files (x86)\\Common Files ProgramFiles=C:\\Program Files PUBLIC=C:\\Users\\Public NUMBER_OF_PROCESSORS=4 windir=C:\\Windows #envTSLOGTSLOG3464=166646496 =::=::\\
package com.ysdx.jsys; import java.util.Enumeration; import java.util.Map; import java.util.Properties; public class JavaSystem { public static void main(String[] args) { Properties properties = System.getProperties(); Enumeration<?> propertyNames = properties.propertyNames(); for (; propertyNames.hasMoreElements();) { String propertyName = (String) propertyNames.nextElement(); System.out.println(propertyName + " = " + properties.getProperty(propertyName)); } System.out.println("-----------------------------------"); Map<String, String> map = System.getenv(); for (String key : map.keySet()) { System.out.println(key + "=" + map.get(key)); } } }
以上是关于java.lang.System的主要内容,如果未能解决你的问题,请参考以下文章
java.lang.System.setProperty()方法实例
ECLIPSE android 布局页面文件出错故障排除Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V