JVM内存模型

1、什么是JVM?

JVM是一个软件,在操作系统之上的,负责将.class文件转化为操作系统认识的语言,从而实现java程序跨平台(操作系统)运行的能力,实际上java程序是在jvm上运行,jvm可存在于各操作系统;

2、JVM内存模型

JVM是一个软件,也就是说是一个程序,它可以解释、运行java程序,jvm内存模型就是在解释、运行java程序过程中在计算机内存中的存在模型;它包含类加载器、运行时数据区、执行引擎、本地库、垃圾回收器等;每个java程序运行起来会生成一个jvm实例,每个jvm实例是相互隔离的;

1)类加载器:

Bootstrap ClassLoader:负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类;

Extension ClassLoader:负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包;

App ClassLoader:负责加载classpath中指定的jar包及目录中class;

Custom ClassLoader:属于应用程序根据自身需要自定义的ClassLoader,如tomcat、jboss都会根据j2ee规范自行实现ClassLoader加载过程中会先检查类是否被已加载,检查顺序是自底向上,从Custom ClassLoader到BootStrap ClassLoader逐层检查,只要某个classloader已加载就视为已加载此类,保证此类只所有ClassLoader加载一次。而加载的顺序是自顶向下,也就是由上层来逐层尝试加载此类;

2)运行时数据区:

堆:jvm内存模型中最大的,在jvm实例生成的时候创建,数据结构为完全二叉树,用来存放对象实例,是垃圾收集器管理的主要区域,被所有线程共享;

栈:线程私有,生命周期与线程相同,栈中存放栈帧,每个方法被执行的时候都会同时创建一个栈帧用于存储局部变量表、操作栈、动态链接、方法出口等信息;每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程;在活动线程中,只有位于栈顶的栈帧才是有效的,称为当前栈帧,与这个栈帧相关联的方法称为当前方法;

方法区:线程共享,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等;

本地方法区:线程私有,与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native方法服务;

程序计数器:线程私有,它的作用可以看做是当前线程所执行的字节码的行号指示器;

直接内存:不受jvm垃圾收集器管理;

3)执行引擎:任务就是将字节码指令解释/编译为对应平台上的本地机器指令才可以,充当了将高级语言翻译为机器语言的译者;

4)本地库:调用本地方法需要的类库,是java与其他语言交换,与底层操作系统交换的途径;

5)垃圾回收器:运行时区域的各个部分,其中程序计数器、虚拟机栈、本地方法栈,3个区域随着线程的生存而生存的,随着线程的结束内存自然就被回收了,不需要考虑垃圾回收的问题;而堆和方法区则不一样,各线程共享,内存的分配和回收都是动态的,因此垃圾收集器所管理的都是这部分内存;

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值