Java如何跨平臺?
JVM如何加載.class
談談反射:反射機制是在運行狀態(tài)中迟郎,對于任意一個類酒朵,都能夠知道這個類的所有屬性和方法露该;對于任意一個對象,都能夠調(diào)用它的任意方法和屬性乍惊;這種動態(tài)獲取信息以及動態(tài)調(diào)用對象方法的功能叫做java反射機制杜秸。
反射例子:
類加載classloader:
雙親委派模型:
實現(xiàn)自定義類的ClassLoader,重寫findClass 實現(xiàn)defineClass:
private String path;
private String classLoaderName;
public MyClassLoader(String path, String classLoaderName) {
this.path = path;
this.classLoaderName = classLoaderName;
}
//用于尋找類文件
@Override
public Class findClass(String name) {
byte[] b = loadClassData(name);
return defineClass(name, b, 0, b.length);
}
//用于加載類文件
private byte[] loadClassData(String name) {
name = path + name + ".class";
InputStream in = null;
ByteArrayOutputStream out = null;
try {
in = new FileInputStream(new File(name));
out = new ByteArrayOutputStream();
int i = 0;
while ((i = in.read()) != -1) {
out.write(i);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return out.toByteArray();
}
}
測試:
public class ClassLoaderChecker {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
MyClassLoader m = new MyClassLoader("/Users/baidu/Desktop/", "myClassLoader");
Class c = m.loadClass("Wali");
System.out.println(c.getClassLoader());
System.out.println(c.getClassLoader().getParent());
System.out.println(c.getClassLoader().getParent().getParent());
System.out.println(c.getClassLoader().getParent().getParent().getParent());
c.newInstance();
}
}
類的加載方式:
隱式加載:new
顯示加載:loadClass和forName
Class.forName得到的class是已經(jīng)初始化完成的
數(shù)據(jù)庫驅(qū)動加載就是使用Class.froName(“com.mysql.jdbc.Driver”),有靜態(tài)代碼塊润绎,一加載的時候就會調(diào)用撬碟。
Classloder.loaderClass得到的class是還沒有鏈接的
程序計數(shù)器:
線程獨立的诞挨,只為Java方法計數(shù),依賴計數(shù)器的值取字節(jié)碼指令
虛擬機棧和本地方法棧(Native那些):
本地方法棧和虛擬機棧所發(fā)揮的作用是很相似的呢蛤,它們之間的區(qū)別不過是 虛擬機棧為虛擬機執(zhí)行Java方法(字節(jié)碼)服務惶傻,而本地方法棧則為虛擬機使用到的Native方法服務
Java棧也稱作虛擬機棧(Java Vitual Machine Stack),也是常說的棧其障。Java棧是Java方法執(zhí)行的內(nèi)存模型银室。Java棧中存放的是一個個的棧幀,每個棧幀對應一個被調(diào)用的方法静秆,在棧幀中包括局部變量表(Local Variables)粮揉、操作數(shù)棧(Operand Stack)、指向當前方法所屬的類的運行時常量池(運行時常量池的概念在方法區(qū)部分會談到)的引用(Reference to runtime constant pool)抚笔、方法返回地址(Return Address)和一些額外的附加信息扶认。棧也是線程私有的。
七個棧幀殊橙,load入棧辐宾,store出棧。
當遞歸過深的時候就會出發(fā)stackoverflowerr異常膨蛮。
元空間MetaSpace 永久代PermGen
虛擬機棧會擴容 至Xmx 一般把Xms和Xmx設(shè)置為一樣叠纹,當發(fā)生擴容時,會發(fā)生內(nèi)存抖動敞葛。
回來再看看