JVM虚拟机组成

1 篇文章 0 订阅

在这里插入图片描述

1、Class Loader类加载器

       Class Loader类加载器是用来加载Class的。它负责将 Class 的字节码形式转换成内存形式的 Class 对象。字节码可以来自于磁盘文件 .class,也可以是 jar 包里的class,也可以来自远程服务器提供的字节流,字节码的本质就是一个字节数组[]byte。

大部分java程序会使用以下三种系统提供的类加载器:
1、启动类加载器Bootstrap ClassLoader,这个类加载器负责将\lib目录下的类库加载到虚拟机内存中,用来加载java的核心库。
2、扩展类加载器Extendsion ClassLoader,这个类加载器负责加载\lib\ext目录下的类库,用来加载java的扩展库。
3、应用程序类加载器(Application ClassLoader)这个类加载器负责加载用户类路径(CLASSPATH)下的类库,一般我们编写的java类都是由这个类加载器加载

2、Native Interface

       Java本地方法接口(JNI),它是Java语言允许Java代码与C、C++代码交互的标准机制。在一个Java应用程序中,我们通过JNI使用我们需要的C/C++函数方法。native关键字说明这个方法是原生函数,也就是这个方法是用C/C++语言实现的,并且被编译成了DLL,由java去调用这些函数的实现体在DLL中,JDK的源代码中并不包含。(举例:Thread.class源码中的带有native关键字的方法只有方法头没有具体实现,public static native void yield();…)。
作用:1.为了使用底层的主机平台的某个特性,而这个特性不能通过JAVA API访问
2.为了访问一个老的系统或者使用一个已有的库,而这个系统或这个库不是用JAVA编写的
3.为了加快程序的性能,而将一段时间敏感的代码作为本地方法实现。

3、Method Area 方法区

方法区是被所有线程共享的。在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。类型信息是由类加载器在类加载时从类文件中提取出来的。方法区的大小不必是固定的,jvm可以根据应用的需要动态调整。同样方法区也不必是连续的。方法区可以在堆(甚至是虚拟机自己的堆)中分配。jvm可以允许用户和程序指定方法区的初始大小,最小和最大尺寸。

4、PC Register 程序计数器

       每一个线程中都有一个程序计数器,就是一个指针,指向方法区中的方法字节码(下一个将要执行的指令代码),由执行引擎读取下一条指令,是一个非常小的内存空间,可以忽略不计。我们熟悉的分支操作、循环操作、跳转、异常处理和线程恢复等基础模型都需要依赖这个计数器来完成。

5、Native Method Stack本地方法栈

       本地方法栈和Java虚拟机栈实现的功能类似,只不过本地方法栈是本地方法运行的内存模型.本地方法被执行的时候,在本地方法栈也会创建一个栈帧,用于存放该本地方法的局部变量表\操作数栈\动态链接\出口信息等。方法执行完毕后相应的栈帧会出栈并释放内存空间.也会抛出OutOfMemoryError和StackOverflowError异常。(内存溢出分为上溢和下溢,比方说栈,栈满时再做进栈必定产生空间溢出,叫上溢,栈空时再做退栈也产生空间溢出,称为下溢。)

6、VM Stack 虚拟机栈

       栈也叫栈内存,主管Java程序的运行,是在线程创建时创建,它的生命周期是跟随线程的生命周期,线程结束栈内存也就释放,对于栈来说不存在垃圾回收的问题,只要线程一结束该栈就释放,生命周期和线程一致,是线程私有的。基本类型的变量和对象的引用变量都是在函数的栈内存中分配。
栈中保存三类数据:
本地变量:输入参数和输出参数以及方法内的变量;
栈操作:记录出栈、入栈的操作
栈帧数据:包括类文件、方法等
栈的运行原理:栈中的数据都是以栈帧的格式存在,栈帧是一个内存区块,是一个数据集,是一个有关方法和运行期数据的数据集,当一个A方法被调用时就产生了一个栈帧A1,并被压入到栈中,依次B方法B1栈,C方法C1栈,执行完毕,先弹出C1栈,依次B1、A1,遵循“先进后出”,“后进先出”的原则

7、Heap 堆

       一个JVM虚拟机只存在一个堆内存,堆内存的大小是可以调节的。 堆是用来存放对象的内存空间。几乎所有的对象都存储在堆中。堆是java虚拟机所管理的内存中最大的一块内存区域,也是被各个线程共享的内存区域,该内存区域存放了对象实例及数组(但不是所有的对象实例都在堆中)。堆内存分为三部分:
1、Young Generation Space 新生区
2、Tenure generation space 养老区
3、Permanent Space 永久区
在这里插入图片描述

1、新生代

       新生代是类的诞生、成长、消亡的区域,一个类在这里产生,应用,最后被垃圾回收器收集。新生区分为两部分:伊甸区和幸存区,所有的类都是在伊甸区new出来的。幸存区有两个:1区和0区。当伊甸区的内存用完时,程序又需要创建对象,垃圾收集器对伊甸区进行轻量的垃圾回收,将伊甸区中不再被其它对象所引用的对象销毁。然后将剩余对象转移到幸存区0,0区也满了,再对0区进行GC回收,然后转移到1区。1区满了,再GC转移到老年区。如果老年区满了,将会进行FullGC,进行养老区的内存清理。养老区GC回收后,依然无法保存对象,产生异常OOM‘OutOfMemoryError’.
出现java.lang.OutOfMemoryError:Java heap space ,说明java虚拟机的堆内存不够,排查原因:
1、Java虚拟机的堆内存设置不够,可以通过参数-Xms-Xmx来调整
2、代码中创建了大量大对象,且长时间不能被垃圾收集器收集

2、老年代

       养老区用于保存从新生区筛选出的JAVA对象。

3、永久代

       永久区是一个常驻内存区域,用于存放JDK自身携带的Class、Interface的元数据(运行环境必须的类信息)。被装载进此区域的数据不会被GC回收,只有关闭JVM虚拟机才能释放这个区域的内存。
当程序启动需要加载大量的第三方jar包时,出现java.lang.OutOfMemoryError:PermGen space异常,说明JAVA虚拟机对永久代的内存设置不够。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值