您好,登錄后才能下訂單哦!
本篇文章為大家展示了Integer面試以及源碼分析,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
??昨天有位朋友去面試,我問他面試問了哪些問題,其中問了Integer相關的問題,以下就是面試官問的問題,還有一些是我對此做了擴展。
答:不。因為Integer緩存池默認是-127-128;
答:可以。使用-Djava.lang.Integer.IntegerCache.high=300
設置Integer緩存池大小
答:亨元模式;
答:sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
sun.misc.VM.getSavedProperty
和System.getProperty
有啥區別?答:唯一的區別是,System.getProperty
只能獲取非內部的配置信息;例如java.lang.Integer.IntegerCache.high
、sun.zip.disableMemoryMapping
、sun.java.launcher.diag
、sun.cds.enableSharedLookupCache
等不能獲取,這些只能使用sun.misc.VM.getSavedProperty
獲取
Integer
初始化源碼分析:private static class IntegerCache { static final int low = -128; static final int high; static final Integer cache[]; static { // high value may be configured by property int h = 127; String integerCacheHighPropValue = sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); if (integerCacheHighPropValue != null) { try { int i = parseInt(integerCacheHighPropValue); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - (-low) -1); } catch( NumberFormatException nfe) { // If the property cannot be parsed into an int, ignore it. } } high = h; cache = new Integer[(high - low) + 1]; int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); // range [-128, 127] must be interned (JLS7 5.1.7) assert IntegerCache.high >= 127; } private IntegerCache() {} }
VM.class
源碼分析:static { allowArraySyntax = defaultAllowArraySyntax; savedProps = new Properties(); finalRefCount = 0; peakFinalRefCount = 0; initialize(); }
getSavedProperty
方法:public static String getSavedProperty(String var0) { if (savedProps.isEmpty()) { throw new IllegalStateException("Should be non-empty if initialized"); } else { return savedProps.getProperty(var0); }
savedProps.getProperty
方法:public String getProperty(String key) { Object oval = super.get(key); String sval = (oval instanceof String) ? (String)oval : null; return ((sval == null) && (defaults != null)) ? defaults.getProperty(key) : sval; }
System.java
源碼分析:/** * 初始化系統類。 線程初始化后調用。 */ private static void initializeSystemClass() { /** * VM可能會調用JNU_NewStringPlatform()來在“props”初始化期間設置那些編碼敏感屬性(user.home,user.name,boot.class.path等), * 它們可能需要通過System.getProperty()進行訪問, 在初始化的早期階段已經初始化(放入“props”)的相關系統編碼屬性。 * 因此,請確保初始化時可以使用“props”,并直接將所有系統屬性放入其中。 */ props = new Properties(); initProperties(props); // initialized by the VM /** * 某些系統配置可以由VM選項控制,例如用于支持自動裝箱的對象標識語義的最大直接內存量和整數高速緩存大小。 通常,庫將獲得這些值 * 來自VM設置的屬性。 如果屬性是 * 僅限內部實現使用,應從系統屬性中刪除這些屬性。 * * 請參閱java.lang.Integer.IntegerCache和 * 例如,sun.misc.VM.saveAndRemoveProperties方法。 * * 保存系統屬性對象的私有副本,該副本只能由內部實現訪問。 去掉 * 某些不適合公共訪問的系統屬性。 */ sun.misc.VM.saveAndRemoveProperties(props); lineSeparator = props.getProperty("line.separator"); sun.misc.Version.init(); FileInputStream fdIn = new FileInputStream(FileDescriptor.in); FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out); FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err); setIn0(new BufferedInputStream(fdIn)); setOut0(newPrintStream(fdOut, props.getProperty("sun.stdout.encoding"))); setErr0(newPrintStream(fdErr, props.getProperty("sun.stderr.encoding"))); /** * 現在加載zip庫,以防止java.util.zip.ZipFile稍后嘗試使用它來加載此庫。 */ loadLibrary("zip"); // 為HUP,TERM和INT(如果可用)設置Java信號處理程序。 Terminator.setup(); /** * 初始化需要為類庫設置的任何錯誤的操作系統設置。 * 目前,除了在使用java.io類之前設置了進程范圍錯誤模式的Windows之外,這在任何地方都是無操作的。 */ sun.misc.VM.initializeOSEnvironment(); /** * 主線程沒有像其他線程一樣添加到其線程組中; 我們必須在這里自己做。 */ Thread current = Thread.currentThread(); current.getThreadGroup().add(current); // 注冊共享秘密 setJavaLangAccess(); /** * 在初始化期間調用的子系統可以調用sun.misc.VM.isBooted(),以避免執行應該等到應用程序類加載器設置完畢的事情。 * 重要信息:確保這仍然是最后一次初始化操作! */ sun.misc.VM.booted(); }
重點看這句:sun.misc.VM.saveAndRemoveProperties(props);
他會移除系統內部使用的配置,咱們來看看源碼是如何操作的。
sun.misc.VM.saveAndRemoveProperties
方法:public static void saveAndRemoveProperties(Properties var0) { if (booted) { throw new IllegalStateException("System initialization has completed"); } else { savedProps.putAll(var0); String var1 = (String)var0.remove("sun.nio.MaxDirectMemorySize"); if (var1 != null) { if (var1.equals("-1")) { directMemory = Runtime.getRuntime().maxMemory(); } else { long var2 = Long.parseLong(var1); if (var2 > -1L) { directMemory = var2; } } } var1 = (String)var0.remove("sun.nio.PageAlignDirectMemory"); if ("true".equals(var1)) { pageAlignDirectMemory = true; } var1 = var0.getProperty("sun.lang.ClassLoader.allowArraySyntax"); allowArraySyntax = var1 == null ? defaultAllowArraySyntax : Boolean.parseBoolean(var1); //移除內部使用的配置,不應該讓看到這些配置信息 var0.remove("java.lang.Integer.IntegerCache.high"); var0.remove("sun.zip.disableMemoryMapping"); var0.remove("sun.java.launcher.diag"); var0.remove("sun.cds.enableSharedLookupCache"); } }
上述內容就是Integer面試以及源碼分析,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。