class装载原理
原理图:

1.执行引擎是Java虚拟机实现的核心,用于处理各种指令。
2.PC寄存器用于存储线程下一次指令的地址和返回值地址,虚拟机为每个线程创建单独的PC寄存器。如果执行的是本地方法,PC寄存器的值为"undefined"。
3.本地方法栈用于存储跟本地方法的相关数据,本地方法方面的内容不属于本文的范畴,知道这一点就行。
4.方法区用于存储被装载类型的信息,如果该类包含了常量或静态成员同样保存在方法区中,所以我们使用一个类的静态成员或者方法时不需
要创建该类的实例,因为方法区所保存的信息已经足够了
5.堆用于存储程序在运行中所创建的对象,例如说我们例子中main函数通过new操作创建了一个对象存放在这个堆空间中,我们把它取名为c,对象c保存指向方法区中SimpleCalculator类的信息
的引用跟存储全局变量val的值。这里我们要区分变量和对象的概念,变量c表示的是对象c的引用,也就是保存了对象c的内存地址,变量c保存在Java栈中,对象c则是表示堆空间中的一个对
象,这就涉及到另外一个问题,当我们把一个对象做为方法的参数传递过去的时候,Java是值传递还是引用传递,答案就是如果传的是对象那么传递的是引用的一个拷贝,也就是说传的是另
外一个引用,但引用指向的对象还是同一个,如果在方法内部修改了该对象则会影响到外部的引用,但如果是指向另外一个对象,则不会影响方法外部的引用;如果传的是基本数据类型
6.Java栈以栈帧为单位保存了线程的运行状态,栈帧由局部变量区,操作数栈和帧数据区组成。局部变量区用于存储线程运行方法的局部变量的值或引用,操作数栈为线程的工作区,存储当前
指令的数据和返回结果,帧数据区则用于保存方法的返回值跟异常信息。
Java栈里面存放操作数(函数参数临时变量环境变量),操作码指令(函数),堆里面存放资源,栈引用资源,核心控制依旧在栈里面进行。堆首要要进行资源管理回收,需对其进行分区,方便管理。
虚拟机为每个线程分配了自己的Java栈,由于方法的局部变量都保存在该Java栈的局部变量区中,这就解释了为什么一个只用到局部变量的方法是线程安全的。Java虚拟机只会对Java栈以帧为单位做压栈和出栈两种操作。当调用一个方法时,虚拟机通过读取方法区对应类型的方法信息分配了一个帧内存,压入Java栈中。在上面的例子我们调用了第一个方法是c.add(5),虚拟机创建一个栈帧并压入Java栈中,在局部变量区保存了参数i的值,val因为是全局变量,跟对象相关联,保存堆对象c中。线程调用add操作时,虚拟机将i的值和val的值压入操作数据栈中,执行iadd指令将这两个值弹出栈做加法运算,并把结果压入操作数栈中,再从操作数栈中弹出结果值存入堆对象c的val中,方法结束,栈帧从Java栈中弹出。同样的方式继续执行c.subtract(5), c.multiply(3), c.result()的操作。因为堆是所有线程共享的,所以对象c并不是线程安全的,如果有多个线程同时调用了add方法,后面执行的结果就会替换掉前面的。
最后程序把结果打印输出到屏幕,main方法结束,没有任何可运行的非守护线程,java进程功成身退,操作系统回收占用的内存,旅程结束。
关于堆和栈我们可以打个比方,假设Java进程所占的内存空间是一个房子,房子里住着四个人分别代表了四个线程,四个人都有属于自己的房间,那么栈空间就是属于自己的那个房间,大家互不干涉房间里的小秘密,那么客厅就是堆空间,存放了各种各样公共的东西,任何人都可以拿来用,那么就难免会出现争用电视机洗衣机等情况,这就是线程不安全。
class装载原理的更多相关文章
- Java虚拟机类装载的原理及实现(转)
Java虚拟机类装载的原理及实现(转) 一.引言 Java虚拟机(JVM)的类装载就是指将包含在类文件中的字节码装载到JVM中, 并使其成为JVM一部分的过程.JVM的类动态装载技术能够在运行时刻动态 ...
- 对于改善 MySQL 数据装载操作有效率的方法是怎样
多时候关心的是优化SELECT 查询,因为它们是最常用的查询,而且确定怎样优化它们并不总是直截了当.相对来说,将数据装入数据库是直截了当的.然而,也存在可用来改善数据装载操作效率的策略,其基本原理如下 ...
- JVM的ClassLoader过程分析
本文来自网络:深入分析Java ClassLoader原理 http://my.oschina.net/zhengjian/blog/133836 一. JVM的ClassLoader过程以及装载原理 ...
- Python开发入门与实战2-第一个Django项目
2.第一个Django项目 上一章节我们完成了python,django和数据库等运行环境的安装,现在我们来创建第一个django project吧,迈出使用django开发应用的第一步. 2.1.创 ...
- 从头认识java-15.7 Map(6)-介绍HashMap的工作原理-装载因子与性能
这一章节我们通过讨论装载因子与性能,再来介绍HashMap的工作原理. 1.什么是装载因子?他有什么作用? 以下的代码就是装载因子 /** * The load factor used when no ...
- 通过源码理解Spring中@Scheduled的实现原理并且实现调度任务动态装载
前提 最近的新项目和数据同步相关,有定时调度的需求.之前一直有使用过Quartz.XXL-Job.Easy Scheduler等调度框架,后来越发觉得这些框架太重量级了,于是想到了Spring内置的S ...
- rt-thread平台 动态装载实现原理
原理分析: a.在链接脚本link.lds里定义了专门存放动态符号表的段RTMSymTab. b.内核对外提供可延时绑定的接口在rtm.h中通过RTM_EXPORT将一对对符号+地址构成的表存放到RT ...
- Hibernate(2)——Hibernate的实现原理总结和对其模仿的demo
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: 开源框架的学习思路(个人总结) Hibernate的运行原理总结 Hibernate实现原理中的两个主要技术 ...
- AOP的实现原理
1 AOP各种的实现 AOP就是面向切面编程,我们可以从几个层面来实现AOP. 在编译器修改源代码,在运行期字节码加载前修改字节码或字节码加载后动态创建代理类的字节码,以下是各种实现机制的比较. 类别 ...
随机推荐
- tunning-prime优化mysql建议
#!/bin/sh # set tabstop=8 ################################################################## ...
- LSTM神经网络
LSTM是什么 LSTM即Long Short Memory Network,长短时记忆网络.它其实是属于RNN的一种变种,可以说它是为了克服RNN无法很好处理远距离依赖而提出的. 我们说RNN不能处 ...
- pip模块的使用
安装pip: sudo apt-get install python-pip (python2的安装) sudo apt-get install python3-pip ...
- centos yum出现no module named yum
运行yum出现如下错误 There was a problem importing one of the Python modules required to run yum. The error l ...
- hdu2085-2086
hdu2085 模拟 #include<stdio.h> ][]; void fun(){ a[][]=; a[][]=; ;i<=;i++){ a[i][]=*a[i-][]+*a ...
- LG1397 [NOI2013]矩阵游戏
题意 婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的n行m列的矩阵(你不用担心她如何存储).她生成的这个矩阵满足一个神奇的性质:若用F[i][j]来表示矩阵中第i行第j列的元素,则F[i][ ...
- Uboot启动命令使用
1.查看根文件系统中的内容 打断Uboot的启动,默认从SD卡启动,查看根文件系统中/boot下的内容(根文件系统在mmcblk0p1上):=> mmc rescan=> ext4ls m ...
- LOADRUNNER之汉字编码转换及\X00问题
我们在使用loadrunner做性能测试的时候经常会出现一些URL编码问题,如当参数中存在中文的时候 "Name=user", "Value=孟林", ENDI ...
- MLCC Y5V 和 X7R 电容记录
MLCC Y5V 和 X7R 电容记录 Y5V 的 MLCC 很少见的,但还是要注意. 自己记录一下,一个 100NF Y5V 电容 ,当温度到达 100度时,容值 为 36NF. 但是 X7R 电容 ...
- Revit API 加载族并生成实例图元
在Revit API中加载族可以使用Doc.LoadFamily方法,传入要加载的族文件路径名,但是这种方式有一种缺点,就是如果族文件在当前工程中没有加载的话则返回成功,如果已经加载过,则返回失败,也 ...