java.lang.System
System類構(gòu)造函數(shù)由private修飾,不可以被實例化,加載時調(diào)用static代碼塊。
System類提供了標準輸入輸出流,錯誤輸出流,獲取外部屬性和系統(tǒng)環(huán)境的方法,加載類庫和文件的方法,快速copy數(shù)組的方法;其中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);}如果在某個線程中調(diào)用了exit會怎樣?下面的例子輸出結(jié)果是hello,把子線程和主線程的內(nèi)容交換也是一樣的結(jié)果。就是說不管在哪個線程調(diào)用了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,
即便不顯示調(diào)用gc,JVM也會自動在一個單獨的線程中執(zhí)行recycling process;
即便不顯示調(diào)用runFinalization,JVM也會自動在一個單獨的線程中執(zhí)行finalization process;
可以很明顯的看出gc和runFinalization是不同的,一個叫做回收過程,一個叫做終結(jié)過程。
調(diào)用runFinalization后,終結(jié)過程會調(diào)用已經(jīng)被廢棄但是尚未調(diào)用其finalization方法的對象。
函數(shù)注釋里的描述都使用了suggest和has made its best effort,可能這兩個函數(shù)還有不足之處。
/*** 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中獲取系統(tǒng)變量的方法:
getenv(String name)返回跟name對應的變量值;
getenv(),這個函數(shù)返回一個不可修改的、包含系統(tǒng)變量名和對應值的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類關于系統(tǒng)屬性的操作有get、set和clear方法,而Environment只有讀取的函數(shù)。
environment是操作系統(tǒng)環(huán)境變量信息,property感覺更像是jvm相關參數(shù)。下面例子的輸出結(jié)果是:
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));}}}
?
轉(zhuǎn)載于:https://www.cnblogs.com/afraidToForget/p/6625357.html
總結(jié)
以上是生活随笔為你收集整理的java.lang.System的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java国际化---native2asc
- 下一篇: 潍坊旅游景点(山东潍坊这10座山独具特色