1 JVM的基本概念
JVM是Java Virtual Machine(Java虚拟机)的缩写,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。引入JVM后,Java语言在不同平台上运行时不需要重新编译。只需生成在JVM上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
JVM本质上就是一个程序,当它在命令行上启动的时候,就开始执行保存在某字节码文件中的指令。Java语言的可移植性正是建立在JJVM的基础上。任何平台只要装有针对于该平台的JVM,字节码文件(.class)就可以在该平台上运行。这就是“一次编译,多次运行”。
2 JVM的位置
JDK : Java程序员常用的开发包、目的就是用来编译和调试Java程序的。JRE:指Java运行环境,写好的程序必须在JRE才能够运行。
JVM:负责将字节码解释成为特定的机器码进行运行,在运行过程中,Java源程序需要通过编译器编译为.class文件,否则JVM不认识。
3 JVM结构
JDK1.8以后,移除了永久代,新增了元空间,使用的是物理内存,方法区在元空间,常量池在方法区。
4 类加载器
App:应用程序加载器,最底层
Ext:扩展类加载器,中间层
Boot:启动类加载器,最高层,返回NULL
5 双亲委派机制
加载一个类时,按App->Ext->Boot的顺序向上查找。
1.当AppClassLoader加载一个class时,它不会尝试加载这个类,而是把类加载请求委派给父类加载器ExtClassLoader去完成。
2.当父类ExtClassLoader加载到这个.class时,他也不会尝试加载这个类,而是把类加载请求委派给父类加载器BootstrapClassLoader。
3.当BootstrapClassLoader加载到这个.class时,它会查找该类是否存在,如果不存在,就往下传递,交给ExtClassLoader,如果ExtClassLoader在自己相应的包中也没找到对应的类,就交给AppClassLoader来加载,如果AppClassLoader也没有,就报ClassNotFoundException()。
假如加载String类(在jre/lib中),在BootstrapClassLoader找到了,就由Boot来加载这个类。
假如加载自定义的Student类,找到Boot没有,下沉到Ext,如果Ext加载过,就由Ext加载,否则下沉到App,由App执行。
好处:
1、防止重复加载同一个.class。通过委托去向上面问一问,加载过了,就不用再加载一遍。保证数据安全。
2、保证核心.class不能被篡改。通过委托方式,不会去篡改核心.class,即使篡改也不会去加载,不同的加载器加载同一个.class也不是同一个Class对象。如果开发者尝试编写一个与rt.jar类库中重名的Java类,可以正常编译,但是永远无法被加载运行。这样保证了Class执行安全。
6 沙箱安全机制
沙箱安全机制是由基于双亲委派机制上 采取的一种JVM的自我保护机制。
7 Native
一个native方法就是一个Java调用非Java代码的接口。native方法是指该方法的实现由非Java语言实现,比如用C或C++实现。
例如:wait(),notify(),clone(),hashcode(),
8 程序计数器
9 栈
7.堆
8.方法区
9.常量池
10.GC算法
11.JVM调优测试:
public class DEMO {
public static void main(String[] args) {
long max=Runtime.getRuntime().maxMemory();
long total = Runtime.getRuntime().totalMemory();
System.out.println("max="+max+"字节\t"+(max/(double)1024/1024)+"MB");
System.out.println("total="+max+"字节\t"+(total/(double)1024/1024)+"MB");
}
//-Xms8m -Xmx8m -XX:+PrintGCDetails
import java.util.Random;
//-Xms8m -Xmx8m -XX:+PrintGCDetails
public class Hello {
public static void main(String[] args) {
String str="zhulin";
while (true){
str=str+new Random().nextInt(88888888)+ new Random().nextInt(99999999);
}
}
}