原理图:

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. C++的类型转换:static_cast、dynamic_cast、reinterpret_cast和const_cast

    在C++中,存在类型转换,通常意味着存在缺陷(并非绝对).所以,对于类型转换,有如下几个原则:(1)尽量避免类型转换,包括隐式的类型转换(2)如果需要类型转换,尽量使用显式的类型转换,在编译期间转换( ...

  2. 如何使用firebug

    什么是Firebug 从事了数年的Web开发工作,越来越觉得现在对WEB开发有了更高的要求.要写出漂亮的HTML代码:要编写精致的CSS样式表展示每个页面模块:要调试javascript给页面增加一些 ...

  3. dfs 与 剪枝

    http://blog.csdn.net/u010700335/article/details/44095171

  4. oracle 11g 建库 建表 增 删 改 查 约束

    一.建库 1.(点击左上角带绿色+号的按钮) 2.(进入这个界面,passowrd为密码.填写完后点击下面一排的Test按钮进行测试,无异常就点击Connect) 二.建表 1-1. create t ...

  5. redis sentinel 高可用(HA)方案部署,及python应用示例

    redis sentinel(哨兵)高可用集群的部署方法,并通过 python 程序实例讲解如何使用 redis sentinel 简介 介绍 redis sentinel(哨兵)集群的部署,配置一主 ...

  6. ZH奶酪:【数据结构与算法】基础排序算法总结与Python实现

    1.冒泡排序(BubbleSort) 介绍:重复的遍历数列,一次比较两个元素,如果他们顺序错误就进行交换. 2016年1月22日总结: 冒泡排序就是比较相邻的两个元素,保证每次遍历最后的元素最大. 排 ...

  7. FastAdmin 开发第三天:认识目录

    以下为标准 FastAdmin 安装后的目录 我们在运行命令时都是在这个目录. 我们所有的命令都在这个目录下面运行. 比如:安装前端组件,bower install 安装php 组件 composer ...

  8. RAC4——架构和变化

    1.RAC的架构 2.由单实例变RAC的变化   1.SGA的变化: 和传统的单实例相比,RAC 实例中SGA最显著的变化时多了一个GRD(Global resource directory)部分. ...

  9. python类的继承的两种方式

    class Animal(object): """docstring for Animal""" def __init__(self, na ...

  10. Linq to sql 增删改查(转帖)

    http://blog.csdn.net/pan_junbiao/article/details/7015633   (LINQ To SQL 语法及实例大全) 代码 Code highlightin ...