JVM基础

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);
        }
    }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值