Java虚拟机的启动通过引导类加载器bootstrap class loader,创建一个初始类initial class来完成的,这个类由Java虚拟机具体实现指定。
如下情况:
在JVM中,对象在内存中的布局分为三部分:对象头、实例数据和对齐填充。

synchronized同步锁就是存储在Java对象头里面的。
Java虚拟机HotSpot有两种对象头:
对象头由两个部分构成:
64位虚拟机的MarkWord是64bit,运行期间,MarkWord存储的数据会随着锁标志位变化而变化。

Google开发的应用于Android系统,并且提供了JIT,发展迅猛。
Dalvik只能称为虚拟机,不可以被叫做Java虚拟机,因为其没有遵循Java虚拟机规范,不可以直接执行Java的class文件。
基于寄存器架构,不是JVM的栈结构。
执行的是编译之后dex文件,执行效率高:
Android 5.0支持提前编译AOT的ART VM替换Dalvik VM。


若想要手写JVM虚拟机,则需要考虑如下两点:
类加载器子系统负责从文件或者网络加载class文件,class文件在文件开头有特定的文件标识。
classLoader只负责class文件的加载,至于是否可执行,则是由Exceution Engine来决定。
加载的信息存放于一块称之为方法区的内存空间,至于是否可运行。除了类信息之外,方法区存放运行时候的常量池信息。可能包括字符串字面常量和数字常量(这部分常量信息是Class文件常量池部分的内存映射)。


给出简单代码:
public class Loader {
public static void main(String[] args) {
System.out.println("I have been class loader");
}
}
类加载过程如图所示:

通过一个类的全限定名称获取该类的二进制字节流。
把该字节流所代表的静态存储结构转换为方法区的运行时数据结构。
内存中生成一个代表该类的java.lang.class对象,并且作为该方法区的各种数据访问入口。
代理模式:给某一个对象提供一个代理,并由代理对象负责控制真实对象的访问。代理模式是一种结构型设计模式 。
代理模式角色分为三种:
代理模式结构简单,核心在于代理类,为了实现让客户端实现一致性对待真实对象和代理对象,在代理模式中引入了抽象层。

代理模式按照指责分类,如下所示:
根据字节码class创建时机分类,可以分为静态代理和动态代理:
给出Girl接口:
package proxyTest;
public interface Girl {
void date();
void watchMovie();
}
给出实现接口方法:
package proxyTest;
import java.text.SimpleDateFormat;
import java.util.Date;
public class wang implements Girl {
@Override
public void date() {
// TODO Auto-generated method stub
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss z");
Date date = new Date(System.currentTimeMillis());
System.out.println("约会日期: " + format.format(date));
}
@Override
public void watchMovie() {
// TODO Auto-generated method stub
System.out.println("lets got to watching movie!!!");
}
}
给出继承invocation的wangProxy:
package proxyTest;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class wangProxy implements InvocationHandler {
private Girl girl;
/**
* @Title: wangProxy
* @Description: TODO(这里用一句话描述这个方法的作用)
* @param: @param girl
* @author: mac
* @throws
*/
public wangProxy(Girl girl) {
super();
this.girl = girl;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
doSomeThingBefore();
Object obj = method.invoke(girl, args);
doSomeThingEnd();
return obj;
}
private void doSomeThingEnd() {
// TODO Auto-generated method stub
System.out.println("your bill is allright, you can enjoy your movie now!");
}
private void doSomeThingBefore() {
// TODO Auto-generated method stub
System.out.println("before start watch, we need to check your bill");
}
public Object getProxyInstance() {
return Proxy.newProxyInstance(girl.getClass().getClassLoader(), girl.getClass().getInterfaces(), this);
}
}
给出main实现代理:
package proxyTest;
public class ListenWang {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 隔壁有个女孩
Girl girl = new wang();
// 通过代理实现访问
wangProxy family = new wangProxy(girl);
Girl friend = (Girl) family.getProxyInstance();
// 实现方法
friend.date();
System.out.println("=======================");
friend.watchMovie();
}
}
before start watch, we need to check your bill
约会日期: 2022-08-22 at 16:17:13 CST
your bill is allright, you can enjoy your movie now!
=================================================
before start watch, we need to check your bill
lets got to watching movie!!!
your bill is allright, you can enjoy your movie now!