jvm概述

 

1.jvm内存使用

运行时数据区,存储元数据(创建对象,方法参数,返回值,运算中间结果)

jvm实例有一个方法区和一个堆

   方法区:class中的类型信息(类数据),静态变量

   堆:运行时创建的对象

线程 - PC寄存器和栈

       (java:下一条指令,局部变量,参数,返回值,中间结果,非java:依赖实现)

java栈:许多栈帧stack frame 帧frame

(一个栈帧包含一个方法,调用一个方法,压入一个栈帧到栈中)

使用栈存储中间数据 , 栈是向下增长

 

2.类型 : 

基本类型

引用类型

 

3.类状态器子系统:

启动类装载器,用户自定义类装载器

(用户自定义类装载器,Class类的实例都放在堆上)

 

4.jvm启动过程:

装载 class文件

连接 验证,分配内存,解析

初始化

 

5.方法区(堆上特殊的区域):

所有线程都共享方法区

 

6.堆(一个jvm实例,只有一个堆):

所有线程所创建的类实例和数组

headoffish一种堆设计:一个句柄池,一个对象池;引用类型变量指向句柄池(指向对象池的指针,指向类数据的指针)

一种堆设计:引用类型变量指向堆,每个对象数据包括一个指向特殊数据结构的指针

数据结构位于方法区,两部分:指向对应类数据的指针,此对象的方法表(方法数据的指针数组)

 

 

7.栈

一个线程启动一个java栈,栈以栈帧为单位

当前方法使用的栈帧为当前帧,当前方法所属类为当前类,当前类的常量池为当前常量池

线程执行一个方法时,它会跟踪当前类和当前常量池

 

当线程调用一个java方法时,虚拟机都会在该线程的java栈中压入一个新帧,新帧保存局部变量,中间运算结果,参数等数据

当方法return,抛出异常时,新帧出栈;上一个方法为新栈帧

 

在栈中存储变量(对象引用(包括this),byte char short都是int,long double是两个)

所有对象都是引用传递

(栈帧指令在PC寄存器中,帧中指令在操作数栈中)

 

栈帧组成:

局部变量区,是字节数组,存储变量,用索引来访问 (指令存储变量索引)

操作数栈:是字节数组,存储指令,只有压栈、出栈操作

           他是jvm的工作区,中间运算在这里完成,如1+2,会出栈两个值,运算后,压入栈

栈帧数据区:访问常量池(存储指向常量池的指针,解析指向类,接口的符号)

            负责方法完成,调用操作下一个栈帧的指令(设置PC寄存器中),以及压入结果到下一个栈帧

            负责异常,抛出异常,找到匹配的catch,或是抛给下一个帧         

           

本地方法栈

 

垃圾收集

1.gc功能:

负责进行对象的内存释放,以及处理堆碎块,处理在活动对象之间的空闲内存;

2.gc算法:

检测垃圾对象,回收垃圾对象所使用的堆空间

   2.1 检测算法:建立一个根对象的集合,和根对象有通路的是活动的,其他对象是垃圾

      引用计数收集器:计数引用个数,0的时候为垃圾。互相引用永远释放不了,每次引用都要有开销

      跟踪收集器:从根节点开始的引用图,遍历每个引用数,并标记;没有被标记的释放

      压缩收集器:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值