Java底层知识:JVM

一、JVM如何加载.class文件

  • ClassLoader:依据特定格式,加载class文件到内存
  • Execution Engine:对命令进行解析
  • Native Interface:融合不同开发语言的原生库为Java所用
  • Runtime Data Area:JVM内存空间结构模型

二、反射的概念

Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象的功能称为Java语言的反射机制

反射的例子

package javabasic;

public class Robot {
    private String name;
    public void sayHi(String helloSentence) {
        System.out.println(helloSentence+" "+name);
    }
    private String throwHello(String tag) {
        return "Hello"+tag;
    }
}
package javabasic;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class reflect {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException {
        Class rc = Class.forName("javabasic.Robot");
        Robot r = (Robot)rc.newInstance();
        System.out.println("Class name is "+rc.getName());
        Method getHello = rc.getDeclaredMethod("throwHello", String.class);
        getHello.setAccessible(true);
        Object str = getHello.invoke(r, "Bob");
        System.out.println("getHello result is "+str);
        Method sayHi = rc.getMethod("sayHi", String.class);
        sayHi.invoke(r, "Welcome");
        Field name = rc.getDeclaredField("name");
        name.setAccessible(true);
        name.set(r, "Alice");
        sayHi.invoke(r, "Welcome");
    }
}

三、ClassLoader的种类

BootStrapClassLoader:加载Java核心API

ExtClassLoader:加载扩展API

AppClassLoader:加载classpath下的class

自定义ClassLoader

四、类加载器的双亲委派机制

 

五、类的加载方式

隐式加载:new

显示加载:loadClass,forname

 六、Java内存模型

 

 Java内存模型

线程独占部分:程序计数器、本地方法栈、虚拟机栈

线程共享部分:MetaSpace、堆

Java堆:对象实例的分配区域;GC管理的主要区域

原文地址:https://www.cnblogs.com/-2016/p/12493384.html