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. 在编译器修改源代码,在运行期字节码加载前修改字节码或字节码加载后动态创建代理类的字节码,以下是各种实现机制的比较. 类别 ...
随机推荐
- 【转】游戏buff设计参见
其实这类帖子并没有多少的设计理论,对于策划的提升和帮助也并不大,原因其实在于其适用性太窄,当我要设计XX象棋的时候,它就滚一边去了. 废话不多说切入正题: 游戏中的BUFF/DEBUFF我们见过很多, ...
- stdlib.h
stdlib 头文件即standard library标准库头文件.stdlib.h里面定义了五种类型.一些宏和通用工具函数. 1 类型例如size_t.wchar_t.div_t.ldiv_t和ll ...
- shell 脚本实战笔记(4)--linux磁盘分区重新挂载
背景: Hadoop的HDFS文件系统的挂载, 默认指定的文件目录是/mnt/disk{N}. 当运维人员, 不小心把磁盘挂载于其他目录, 比如/mnt/data, /mnt/disk01, /mnt ...
- can-utils源码解析cansend
前言 本文主要介绍socketCan中的发送函数cansend的源码解析. 代码 /* * cansend.c - simple command line tool to send CAN-frame ...
- 转:Linux实时将所有输出重定向到文件
转自: Linux的重定向机制十分好用,我们经常需要在服务器上挂起一个服务程序,然后将该程序的所有输出重定向到某个文件,这样即使我们注销了用户,程序依然在linux服务器上运行着. 但是重定向的输出经 ...
- [LeetCode&Python] Problem 637. Average of Levels in Binary Tree
Given a non-empty binary tree, return the average value of the nodes on each level in the form of an ...
- mysql完整版
mysql: dbs 数据库系统 bdms 数据库管理系统 bda 数据库管理员 db 数据库 dba通过dbms来操作db! 关系型数据库和非关系型数据库 登录mysql mysql -h主机地址 ...
- hive split 注意事项
hive字符串分割函数 split(str, regex) - Splits str around occurances that match regexTime taken: 0.769 secon ...
- Mysql隔离级别 sql示例理解
前言 事务要解决的是多线程并发修改数据库的问题.Mysql innodb 引擎支持事务.类似 Java 中的各种锁,例如乐观锁(CAS),读写锁,悲观锁.事务也有很多级别. 每个隔离级别要解决的问题都 ...
- python type metaclass
在python中一切皆对象, 所有类的鼻祖都是type, 也就是所有类都是通过type来创建. 传统创建类 class Foo(object): def __init__(self,name): se ...