原理图:

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装载原理的更多相关文章

  1. Java虚拟机类装载的原理及实现(转)

    Java虚拟机类装载的原理及实现(转) 一.引言 Java虚拟机(JVM)的类装载就是指将包含在类文件中的字节码装载到JVM中, 并使其成为JVM一部分的过程.JVM的类动态装载技术能够在运行时刻动态 ...

  2. 对于改善 MySQL 数据装载操作有效率的方法是怎样

    多时候关心的是优化SELECT 查询,因为它们是最常用的查询,而且确定怎样优化它们并不总是直截了当.相对来说,将数据装入数据库是直截了当的.然而,也存在可用来改善数据装载操作效率的策略,其基本原理如下 ...

  3. JVM的ClassLoader过程分析

    本文来自网络:深入分析Java ClassLoader原理 http://my.oschina.net/zhengjian/blog/133836 一. JVM的ClassLoader过程以及装载原理 ...

  4. Python开发入门与实战2-第一个Django项目

    2.第一个Django项目 上一章节我们完成了python,django和数据库等运行环境的安装,现在我们来创建第一个django project吧,迈出使用django开发应用的第一步. 2.1.创 ...

  5. 从头认识java-15.7 Map(6)-介绍HashMap的工作原理-装载因子与性能

    这一章节我们通过讨论装载因子与性能,再来介绍HashMap的工作原理. 1.什么是装载因子?他有什么作用? 以下的代码就是装载因子 /** * The load factor used when no ...

  6. 通过源码理解Spring中@Scheduled的实现原理并且实现调度任务动态装载

    前提 最近的新项目和数据同步相关,有定时调度的需求.之前一直有使用过Quartz.XXL-Job.Easy Scheduler等调度框架,后来越发觉得这些框架太重量级了,于是想到了Spring内置的S ...

  7. rt-thread平台 动态装载实现原理

    原理分析: a.在链接脚本link.lds里定义了专门存放动态符号表的段RTMSymTab. b.内核对外提供可延时绑定的接口在rtm.h中通过RTM_EXPORT将一对对符号+地址构成的表存放到RT ...

  8. Hibernate(2)——Hibernate的实现原理总结和对其模仿的demo

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: 开源框架的学习思路(个人总结) Hibernate的运行原理总结 Hibernate实现原理中的两个主要技术 ...

  9. AOP的实现原理

    1 AOP各种的实现 AOP就是面向切面编程,我们可以从几个层面来实现AOP. 在编译器修改源代码,在运行期字节码加载前修改字节码或字节码加载后动态创建代理类的字节码,以下是各种实现机制的比较. 类别 ...

随机推荐

  1. 转载: Linux 操作系统挂起、休眠、关机相关命令

    最近每天的工作都难以在当天结束,而本人又不是那种善于熬夜的人,因此就需要将电脑中的工作文件全部保存,以往都是将所有工作文件保存关机,但是最近发现Linux系统有一个好神奇的命令: 休眠: sudo p ...

  2. ASCII编码和Unicode编码的区别

    链接: 计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了.Unicode标准也在不断发展,但最常用的是用两个字 ...

  3. mos如何工作参考地址

    https://wenku.baidu.com/view/c118c3fb360cba1aa811da9d.html?qq-pf-to=pcqq.c2c

  4. 【LGR-054】洛谷10月月赛II

    [LGR-054]洛谷10月月赛II luogu 成功咕掉Codeforces Round #517的后果就是,我\(\mbox{T4}\)依旧没有写出来.\(\mbox{GG}\) . 浏览器 \( ...

  5. test20181017 B君的第二题

    题意 分析 考场50分 旁边的L君告诉我,求的就是非升子序列的个数,于是写了个树状数组. 但是\(\mod{2333} > 0\)还需要组合数中没有2333的倍数,所以实际上只得了\(a_i \ ...

  6. Eclipse使用前准备(转)

    Eclipse的发布流程 M1  08/19/2009      M2     09/30/2009     M3     11/11/2009     M4     12/16/2009     M ...

  7. php 备份和恢复数据库

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. docker 知识点

    docker 教程:http://www.runoob.com/docker/docker-tutorial.html docker 仓库地址:https://store.docker.com/ do ...

  9. java的关键字:static、final

    java的 static: 性质 静态对象 非静态对象 拥有属性: 是类共同拥有的 是类各对象独立拥有的 内存分配: 内存空间上是固定的 空间在各个附属类里面分配 分配顺序: 先分配静态对象的空间 继 ...

  10. jmeter自动生成报告

    从JMeter 3.0开始已支持自动生成动态报告,我们可以更容易根据生成的报告来完成我们的性能测试报告. 如何生成html测试报告 如果未生成结果文件(.jtl),可运行如下命令生成报告: jmete ...