JVM的知识点有哪些

发布时间:2021-10-23 15:48:30 作者:iii
来源:亿速云 阅读:145

这篇文章主要介绍“JVM的知识点有哪些”,在日常操作中,相信很多人在JVM的知识点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JVM的知识点有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

1、什么是JVM?在哪? 


JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

百度的解释云里雾里,对于我们Java程序员,说白了就是:
对于JVM的位置:  
JVM的知识点有哪些  



2、JVM、JRE、JDK 的关系 


JDK(Java Development Kit):Java开发工具包  

JRE(Java Runtime Environment):Java运行环境

JDK = JRE + javac/java/jar 等指令工具

JRE = JVM + Java基本类库

JVM的知识点有哪些

3、JVM体系结构 

Java虚拟机主要分为五大模块:

    

    JVM的知识点有哪些



4、三种JVM(了解) 


Sun公司   HotSpot  (我们都用的这个)

JVM的知识点有哪些

BEA公司   JRockit
IBM公司   J9 VM

5、类加载器  


作用:加载  .Class  字节码文件

1、回顾new对象的过程

public class Student {
    //私有属性
    private String name;

    //构造方法
    public Student(String name) {
        this.name = name;
    }
}

类是模板、模板是抽象的;对象是具体的,是对抽象的实例化

//运行时,JVM将Test的信息放入方法区
public class Test{
    //main方法本身放入方法区
  public static void main(String[] args){
        //s1、s2、s3为不同对象
        Student s1 = new Student("zsr");  //引用放在栈里,具体的实例放在堆里
        Student s2 = new Student("gcc");
        Student s3 = new Student("BareTH");
        System.out.println(s1.hashCode());
        System.out.println(s2.hashCode());
        System.out.println(s3.hashCode());
        //class1、class2、class3为同一个对象
        Class<? extends Student> class1 = s1.getClass();
        Class<? extends Student> class2 = s2.getClass();
        Class<? extends Student> class3 = s3.getClass();
        System.out.println(class1.hashCode());
        System.out.println(class2.hashCode());
        System.out.println(class3.hashCode());
    }
}
根据结果,我们发现:

我们画图分析以下  new一个对象的流程:
  1. 首先Class Loader读取字节码.class文件,加载初始化生成Student模板类


  2. 通过Student模板类new出三个对象

JVM的知识点有哪些


那么Class Loader具体是怎么执行我们的.class字节码文件呢,这就引出了我们类加载器~

2、类加载器的类别

我们编写这样一个程序

JVM的知识点有哪些


根据返回结果,我们来讲解以下三种加载器:

级别从高到底

1.启动类(根)加载器:BootstrapClassLoader
    1. ‍c++编写,加载java核心库 java.*,构造拓展类加载器应用程序加载器

    2. 根加载器加载拓展类加载器,并且将拓展类加载器的父加载器设置为根加载器

    3. 然后再加载应用程序加载器,应将应用程序加载器的父加载器设置为拓展类加载器

    4. 由于引导类加载器涉及到虚拟机本地实现细节,我们无法直接获取到启动类加载器的引用;这就是上面那个程序我们第三个结果为null的原因。

    5. 加载文件存在位置



JVM的知识点有哪些
    
2. 拓展类加载器:PlatformClassLoader
    1. java编写,加载扩展库,开发者可以直接使用标准扩展类加载器。

    2. java9之前为ExtClassloader,Java9以后改名为PlatformClassLoader

    3.     加载文件存在位置


 JVM的知识点有哪些

3.应用程序加载器:AppClassLoader
             1  .  java  编写,加载程序所在的目录
      

        2. 是Java默认的类加载器


4.用户自定义类加载器:CustomClassLoader
            1  .  java  编写,用户自定义的类加载器,可加载指定路径的  class  文件


6、双亲委派机制 

1、什么是双亲委派机制

2、作用

举个例子:我们重写以下java.lang包下的String类

JVM的知识点有哪些


发现报错了,这就是  双亲委派机制  起的作用,当类加载器委托到  根加载器  的时候,  String类  已经被  根加载器  加载过一遍了,所以不会再加载,从一定程度上防止了危险代码的植入!!
作用总结:
  1. 1.  防止重复加载同一个


  2. .class

  3. 。通过不断委托父加载器直到根加载器,如果父加载器加载过了,就不用再加载一遍。保证数据安全。



  4. 2. 保证系统核心.class,如上述的String类不能被篡改。通过委托方式,不会去篡改核心.class,即使篡改也不会去加载,即使加载也不会是同一个.class对象了。不同的加载器加载同一个.class也不是同一个class对象。这样保证了class执行安全。


    

7、沙箱安全机制 

这里引用了这篇博文引用链接,了解即    

什么是沙箱?

Java安全模型的核心就是Java沙箱(sandbox)

所有的Java程序运行都可以指定沙箱,可以定制安全策略。

java中的安全模型演进

在Java中将执行程序分成  本地代码  和  远程代码  两种
如下图所示

JVM的知识点有哪些

如此严格的安全机制也给程序的功能扩展带来障碍,比如当用户希望远程代码访问本地系统的文件时候,就无法实现。
因此在后续的   Java1.1   版本中,针对安全机制做了改进,增加了  安全策略  ,允许用户指定代码对本地资源的访问权限。
如下图所示
JVM的知识点有哪些
在  Java1.2  版本中,再次改进了安全机制,增加了  代码签名  。
如下图所示
JVM的知识点有哪些  JVM的知识点有哪些‍  

当前最新的安全机制实现,则引入了  域 (Domain)   的概念。
JVM的知识点有哪些

组成沙箱的基本组件

1. 字节码校验器(bytecode verifier)

确保Java类文件遵循Java语言规范。这样可以帮助Java程序实现内存保护。但并不是所有的类文件都会经过字节码校验,比如核心类(如上述java.lang.String)。

2. 类装载器(class loader)

其中类装载器在3个方面对Java沙箱起作用
虚拟机为不同的类加载器载入的类提供不同的命名空间,命名空间由一系列唯一的名称组成,每一个被装载的类将有一个名字,这个命名空间是由Java虚拟机为每一个类装载器维护的,它们互相之间甚至不可见。
类装载器采用的机制是双亲委派模式。  
  1. 从最内层JVM自带类加载器开始加载,外层恶意同名类得不到加载从而无法使用;


  2. 由于严格通过包来区分了访问域,外层恶意的类通过内置代码也无法获得权限访问到内层类,破坏代码就自然无法生效。


8、Native本地方法接口 

JNI:Java Native Interface

本地接口的作用是融合不同的编程语言为Java所用,它的初衷是融合C/C++程序

JVM的知识点有哪些

native  :凡是带native关键字的,说明java的作用范围达不到了,会去调用底层c语言的库!进入本地方法栈,调用  本地方法接口JNI  ,拓展Java的使用,融合不同的语言为Java所用
目前该方法使用的越来越少了,除非是与硬件有关的应用,比如通过Java程序驱动打印机或者Java系统管理生产设备,在企业级应用中已经比较少见。因为现在的异构领域间通信很发达,比如可以使用 Socket通信,也可以使用 Web service等等,了解即可!


9、PC寄存器  

程序计数器  :Program Counter Register

10、方法区 

方法区  :Method Area

1. 方法区中有啥?

  1. 静态变量(static)

  2. 常量(final)

  3. 类信息(构造方法、接口定义)

  4. 运行时的常量池

2. 创建对象内存分析

JVM的知识点有哪些
JVM的知识点有哪些


例如这个例子中,生成了对应的Person模板类,name常量“zsr”放在常量池中,三个对象的引用放在栈中,该引用指向放在堆中的三个实例对象。
这就是堆、栈、方法区的交互关系

11、栈  

又称  栈内存  ,主管程序的运行,生命周期和线程同步,线程结束,栈内存就释放了,  不存在垃圾回收

1、栈中存放啥?

  1. 8大基本类型

  2. 对象引用

  3. 实例的方法

2、栈运行原理

JVM的知识点有哪些

3、堆栈溢出StackOverflowError

举个例子:

public class Test {
    public static void main(String[] args) {
        new Test().a();
    }

    public void a() {
        b();
    }

    public void b() {
        a();
    }
}


最开始,main()方法压入栈中,然后执行a(),a()压入栈中;再调用b(),b()压入栈中;以此往复,a与b方法不断被压入栈中,最终导致栈溢出

JVM的知识点有哪些

JVM的知识点有哪些

12、堆  

Heap,一个JVM只有一个堆内存(栈是线程级的),堆内存的大小是可以调节的

JVM的知识点有哪些

1、堆中有啥?

实例化的对象

2、堆内存详解

JVM的知识点有哪些

1、Young 年轻代

对象诞生、成长甚至死亡的区

Eden区占大容量,Survivor两个区占小容量,默认比例是8:1:1

2、Tenured 老年代

3、Perm 元空间

存储的是Java运行时的一些环境或类信息,这个区域不存在垃圾回收!关闭虚拟机就会释放这个区域内存!

这个区域常驻内存,用来存放JDK自身携带的Class对象、Interface元数据。

名称演变
注意:元空间在逻辑上存在,在物理上不存在
新生代 + 老年代的内存空间 = JVM分配的总内存
如图所示:

JVM的知识点有哪些

3、什么是OOM?

内存溢出java.lang.OutOfMemoryError

产生原因:
  1. 分配的太少

  2. 用的太多

  3. 用完没释放

4、GC垃圾回收

GC垃圾回收,主要在年轻代和老年代

首先,对象出生再  伊甸园区
Minor GC:伊甸园区满时触发;从年轻代回收内存
Full GC:老年代满时触发;清理整个堆空间,包含年轻代和老年代
Major GC:清理老年代

什么情况永久区会崩?
一个启动类加载了大量的第三方Jar包,Tomcat部署了过多应用,或者大量动态生成的反射类
这些东西不断的被加载,直到内存满,就会出现  OOM

13、堆内存调优 

1、查看并设置JVM堆内存

查看我们jvm的  堆内存

public class Test {
    public static void main(String[] args) {
        //返回jvm试图使用的最大内存
        long max = Runtime.getRuntime().maxMemory();
        //返回jvm的初始化内存
        long total = Runtime.getRuntime().totalMemory();
        //默认情况下:分配的总内存为电脑内存的1/4,初始化内存为电脑内存的1/64
        System.out.println("max=" + max / (double) 1024 / 1024 / 1024 + "G");
        System.out.println("total=" + total / (double) 1024 / 1024 / 1024 + "G");
    }
}

JVM的知识点有哪些

JVM的知识点有哪些

默认情况下:
我们可以手动调堆内存大小

JVM的知识点有哪些

在  VM options  中可以指定  jvm试图使用的最大内存  和  jvm初始化内存  大小
  
  
  -Xms1024m -Xmx1024m -Xlog:gc*
JVM的知识点有哪些

JVM的知识点有哪些


2、怎么排除OOM错误?

1. 尝试扩大堆内存看结果

利用上述方法指定jvm试图使用的最大内存jvm初始化内存大小

2. 利用内存快照工具JProfiler

内存快照工具:
作用:

3. 什么是Dump文件?如何分析?

Dump文件是进程内存镜像,可以把程序的执行状态通过调试器保存到dump文件中

import java.util.ArrayList;

public class Test {
    byte[] array = new byte[1024 * 1024];//1M

    public static void main(String[] args) {
        ArrayList<Test> list = new ArrayList<>();
        int count = 0;
        try {
            while (true) {
                list.add(new Test());
                count++;
            }
        } catch (Exception e) {
            System.out.println("count=" + count);
            e.printStackTrace();
        }
    }
}

运行该程序,报错OOM

JVM的知识点有哪些

接下来我们设置以下堆内存,并附加生成对应的dump文件的指令

-Xms1m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError

-XX:+HeapDumpOnOutOfMemoryError  表示当JVM发生OOM时,自动生成DUMP文件。

再次点击运行,下载了对应的Dump文件

JVM的知识点有哪些

我们右键该类,点击  Show in Explorer

JVM的知识点有哪些

一直点击上级目录,直到找到.hprof文件,与src同级目录下

JVM的知识点有哪些

我们双击打开,可以看到每块所占的大小,便于分析问题

JVM的知识点有哪些

点击Thread Dump,里面是所有的线程,点击对应的线程可以看到相应的错误,反馈到具体的行,便于排错

JVM的知识点有哪些

每次打开Dump文件查看完后,建议删除,可以在idea中看到,打开文件后生成了很多内容,占内存,建议删除

JVM的知识点有哪些


附:安装Jprofiler教程

1.idea中安装插件
JVM的知识点有哪些
2.下载客户端 https://www.ej-technologies.com/download/jprofiler/files

JVM的知识点有哪些

3.安装客户端
选择自定义安装,注意:路径不能有中文和空格
JVM的知识点有哪些

JVM的知识点有哪些

这里name和Company任意,License Key大家可以寻找对应版本的注册机获得

JVM的知识点有哪些

JVM的知识点有哪些

后续默认,安装成功即可!!!
4. 安装完成后,重启IDEA,可以看到我们的内存快照工具
JVM的知识点有哪些

 打开IDEA的设置,找到Tools里面的JProfiler,没有设置位置则设置位置

JVM的知识点有哪些

此时则全部安装完成!

14、GC垃圾回收 

1、回顾

Garbage Collection:垃圾回收

JVM的知识点有哪些

在12.4中,我们已经对GC的流程进行了大概的讲解,这里做一些总结:

2、GC算法

1、引用计数算法(很少使用)


 JVM的知识点有哪些

2、复制算法

复制算法主要发生在  年轻代  (   幸存0区   和   幸存1区  )

这也就是幸存0区幸存1区总有一块为空的原因

JVM的知识点有哪些

好处:没有内存的碎片(内存集中在一块)
坏处:
  1. 浪费了内存空间(浪费了幸存区一半空间)

  2. 对象存活率较高的场景下(比如老年代那样的环境),需要复制的东西太多,效率会下降。

最佳使用环境:对象存活度较低的时候,也就是  年轻代

3、标记–清除算法

为每个对象存储一个标记位,记录对象的生存状态
  1. 标记阶段:这个阶段内,为每个对象更新标记位,检查对象是否死亡;

  2. 清除阶段:该阶段对死亡的对象进行清除,执行 GC 操作。


JVM的知识点有哪些
缺点:两次扫描严重浪费时间,会产生内存碎片
优点:不需要额外的空间

4、标记–整理算法

标记-整理法   是   标记-清除法   的一个改进版。
又叫做   标记-清楚-压缩法
  1. 标记阶段,该算法也将所有对象标记为存活和死亡两种状态;

  2. 不同的是,在第二个阶段,该算法并没有直接对死亡的对象进行清理,而是将所有存活的对象整理一下,放到另一处空间,然后把剩下的所有对象全部清除。

JVM的知识点有哪些  
可以进一步优化,在内存碎片不太多的情况下,就继续标记清除,到达一定量的时候再压缩.

到此,关于“JVM的知识点有哪些”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

推荐阅读:
  1. JVM是什么?JVM的方法有哪些?
  2. java JVM原理与常识知识点

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

jvm java

上一篇:JVM内存结构是怎么样的

下一篇:JVM中GC垃圾回收原理是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》