Java核心:类加载和JVM内存的分配
类的加载:
指的是将class文件的二进制数据读入到运行时数据区(JVM在内存中划分的)
中,并在方法区内创建一个class对象。
类加载器:
负责加载编译后的class文件(字节码文件)到JVM(Java虚拟机)当中。
而类加载器主要分为以下几种:
1.Bootstrap class loader (引导类加载器)
负责加载Java核心类库。在jre\lib目录下,包括rt.jar(Java基础类库),这些
都是Java的核心类库。而且这个加载器是由C语言编写的,所以在Java程序中是获取
不到的。
2.Extension class loader(扩展类加载器)
负责加载Java平台下扩展功能的jar包,这些jar包在jre\lib\ext目录下。这个加载
器由Java语言编写的。
3.System class loader(系统类加载器)
负责加载classpath目录下的所有类库,classpath目录下的class文件一般
是我们自己写的java文件编译后的。而这个加载器是由Java语言写的。
这些类加载器协同起来完成整个类的加载过程,因此这些类的加载模式基于
”双亲委托模型“。
”双亲委托模型“:
程序运行后,编译器把Java文件编译成class文件后,首先负责加载的是
系统类加载器,但它不会马上加载,而是将此任务移送给它的父类加载器扩展
类加载器加载,扩展类加载器也是将此任务移送给引导类加载器加载。
class文件到了引导类加载器那,它先判断能不能加载这个类,如果能,就
加载;不能,移送给其子加载器,以此类推。最终我们编写的class都会配置在
classpath环境中,所以,这个类加载任务还是由系统类加载器完成。如果系统
类加载器都不能加载,就抛出ClassNotFoundException。
当一个class加载到JVM中,类加载阶段已经完成。接下来JVM分配内存,对整个
class文件(文件里面都是二进制的汇编命令)进行内容解析(JVM对二进制的命
令逐行解析,交由CPU执行)。
内存分配:
JVM运行起来时就给内存划分空间,这块空间就称为运行时数据区。
运行时数据区被划分为以下几块内容:
1.栈:
每一个线程运行起来的时候就会对应一个栈(线程栈),栈中存放的数据被当前
线程所独享(不会产生资源共享情况,所以线程是安全的)。而栈当中存放的是栈帧,
当线程调用方法时,就是形成一个栈帧,并将这个栈帧进行压栈操作。方法执行完后,
进行出栈操作。这个栈帧里面包括(局部变量,操作数栈,指向当前方法对应类的常
量池引用,方法返回地址等信息)。
2.本地方法栈:
本地方法栈的机制和栈的相似,区别在于,栈运行的是Java实现的方法,而本地
方法栈运行的是本地方法。本地方法指的是JVM需要调用非Java语言所实现的方法,
例如C语言。在JVM规范中,没有强化性要求实现方一定要划分出本地方法栈(例如:
HotSpot虚拟机将本地方法栈和栈合二为一)和具体实现(不同的操作系统,对JVM
规范的具体实现都不一样)。
3.程序计数器:
程序计数器也可以称为PC寄存器(通俗讲就是 指令缓存)。它主要用于缓存当前
程序下一条指令的指令地址,CPU根据这个地址找到将要执行的指令。这个寄存器是JVM
内部实现的,不是物理概念上的计数器,不过和JVM的实现逻辑一样。
4.堆:
堆内存主要存放创建的对象和数组。堆内存在JVM中是唯一的,能被多个线程所共享。
堆里面的每一个对象都存放着实例的实例变量。堆内存的对象没有被引用,会自动被Java
垃圾回收机制回收。
当在方法中定义了局部变量,如果这个变量是基本数据类型,那么这个变量的值就直接
存放在栈中;如果这个变量是引用数据类型,那么变量值就存放在堆内存中,而栈中存放的是
指向堆中的引用地址。
5.方法区:
方法区在JVM也是一个非常重要的一块内存区域,和堆一样,可以被多个线程多共享。
主要存放每一个加载class的信息。class信息主要包含魔数(确定是否是一个class文件),常量
池,访问标志(当前的类是普通类还是接口,是否是抽象类,是否被public修饰,是否使用了final
修饰等描述信息......),字段表集合信息(使用什么访问修饰符,是实例变量还是静态变量,是否
使用了final修饰等描述信息.....),方法表集合信息(使用什么访问修饰符,是否静态方法,是否
使用了final修饰,是否使用了synchronized修饰,是否是native方法......)等内容。当一个类加
载器加载了一个类的时候,会根据这个class文件创建一个class对象,class对象就包含了上述的信息。
后续要创建这个类的实例,都根据这个class对象创建出来的。
6.常量池:
常量池是方法区中的一部分,存放class对象中最重要的资源。JVM为每一个class对象都维护一个
常量池。它主要存储两种类型的常量:
1.字面常量:
字面常量通常就是在Java中定义的字面量值。例如:int = 1,中的 1,String s = "hello",这个
hello就是字面量。或者使用final修饰的常量值。
2.符号引用:
符号引用主要包括类和接口的完整类名,属性的名称和描述符,方法名和描述符等。
-----------------------------------------------------------
Java核心:类加载和JVM内存的分配的更多相关文章
- Java SE之调整JVM内存笔记
[文档整理系列] Java SE之调整JVM内存笔记 一般JVM内存限制是64Mbyte Eclipse下 Run as configrationArguments选项:-Xmx80m [设置虚拟机 ...
- ClassLoader类加载机制&&JVM内存管理
一.ClassLoader类加载机制 在java中类加载是遵循委派双亲加载的:通过调用loadClass方法逐级往上传递委派加载请求,当找不到父ClassLoader时调用其findClass方法尝试 ...
- 深入理解java虚拟机(linux与jvm内存关系)
本文转载自美团技术团队发表的同名文章 https://tech.meituan.com/linux-jvm-memory.html 一, linux与进程内存模型 要理解jvm最重要的一点是要知道jv ...
- jvm学习006 jvm内存结构分配
主要内容如下: JVM启动流程 JVM基本结构 内存模型 编译和解释运行的概念 一.JVM启动流程: JVM启动时,是由java命令/javaw命令来启动的. 二.JVM基本结构: JVM基本结构图: ...
- Java虚拟机详解----JVM内存结构
http://www.cnblogs.com/smyhvae/p/4748392.htm 主要内容如下: JVM启动流程 JVM基本结构 内存模型 编译和解释运行的概念 一.JVM启动流程: JVM启 ...
- 面试之四:JVM内存区域分配
1.程序计数器(线程私有)[不会OOM] 记录线程执行的代码位置,每个线程各自独有. 2.栈:虚拟机栈和本地方法栈(线程私有)[会OOM和StackOverflow] 虚拟机栈 每个JAVA方法在执行 ...
- java程序执行时,JVM内存
高淇 java 31集 类代码,static,常量池到方法区 (常量池会在类之间共享) 局部变量 到栈 对象到 堆 高淇 32集 增加一个computer类
- Java数据类型和不同数据类型在JVM内存分配
1.java数据类型分类 Java语言是强类型(Strongly typed)语言,强类型包含两方面的含义:①所有的变量必须先声明,后使用:②指定类型的变量只能接受类型与之匹配的值.这意味着每个变量和 ...
- JVM原理(Java代码编译和执行的整个过程+JVM内存管理及垃圾回收机制)
转载注明出处: http://blog.csdn.net/cutesource/article/details/5904501 JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.e ...
随机推荐
- 移动端中pagehide、pageshow的应用
闲话少叙,来进入场景:订单提交页面,各种积分礼品卡规则都算好了,用户提交表单开始支付,支付完成进入成功提示页面,这是绝大部分网站的付款体验吧,那么问题来了,web移动端中进入成功提示页后,用户点击浏览 ...
- easyui-datagrid自动合并行
1.目标 1.1表格初始化完成后,已经自动合并好需要合并的行: 1.2当点击字段排序后,重新进行合并: 2.实现 2.1 引入插件 /** * author ____′↘夏悸 * create dat ...
- HTML 5 Web 存储
HTML5 提供了两种在客户端存储数据的新方法: localStorage - 没有时间限制的数据存储sessionStorage - 针对一个 session 的数据存储 html5 web sto ...
- a标签中调用js方法
1. a href="javascript:void(0);" onclick="js_method()" 这种方法是很多网站最常用的方法,也是最周全的方法,o ...
- FMX 讯息框 FrameDialog
说明:目前 Delphi XE5 无法在 Android 平台下正常使用 ShowMessage 或 MessageDlg 功能(当失去焦点后会当机,如关闭屏幕后再开),这里展示如何使用 TFrame ...
- ❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️html,js随笔。❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️
a标签本身的文字居中. a{ display:block; text-align:center; } 设置div1在另一个div2里居中,(写了左边margin 就别写右边了不然ie6有毛病,当然本身 ...
- iOS 10 常见配置的问题
UITextField 在iOS 10 中,UITextField新增了textContentType字段,是UITextContentType类型,它是一个枚举,作用是可以指定输入框的类型,以便系统 ...
- LGLTagsView
做项目的时候经常会用到标签,比如说现在很多项目中搜索历史用标签展示 和 选择某个产品的不同属性用标签展示....网上的有很多封装好的标签,但是作为一个上进的程序员,都希望能有一个自己写的.其实也是一种 ...
- 【FOL】万里长征第一步
准备了好久了,中间断断续续看了些资料,也写了几个小demo练手,今天正式开始. 因为要模拟debug和release环境,手上资源又很缺,必须把一些已经拼好的图片进行切割,网络上找了半天倒是有几个切图 ...
- 如何在MFC对话框应用程序中使用ColorPicker控件
在日常的应用程序开发中,当涉及到曲线绘制时,为了将多条不同类型的曲线区分开,常常需要将它们指定不同的颜色.今天在这里简单的记录一下,如何实现及使用ColorPicker控件.程序用到4个文件依次为:C ...