浅谈java虚拟机|系列2|JVM运行时
今天我们继续谈谈JVM架构。
今天主要讲讲JVM运行时,
先来一个图:
上篇文章,我们知道,JVM运行时,简单来说就是把class文件翻译成操作系统相关的机器码(或汇编语言),然后通过调用操作系统函数来完成程序运行的一个组件。
从详细方面来说,它又分为以下几个部分:
1.class文件加载系统(类加载器)
2.运行时数据区
3.执行引擎
首先,我们来看类加载器。类加载器主要的工作有:
简单来说,它主要的工作就是加载并初始化class文件。
再看看运行时数据 区,它主要是对内存的一个抽象,它主要分两块:堆(heap)和栈(stack)。当然还有程序计数器,这个以后再说。
什么是堆?
堆,简单来说,就是动态分配对象数据的区域,比如我们java程序里,用new关键词构造一个对象,那这个对象的数据就要在堆里面动态分配。
因为,这块要动态分配内存,就会涉及内存的回收,也就是GC,即垃圾回收。(下面会讲,先按下不表)
堆,打个比方,之前我们说,运行时组件,是class文件与操作系统之间的翻译器。我们可以想象一下,这个jvm运行时,就像一个翻译工作室。
这个翻译工作室里,有很多翻译工作者。这些翻译工作者,就是线程。
那这个堆,就是这个翻译者的草稿纸。每次翻译都要把一些有用的信息记下来,当然,最好用铅笔。
翻译完了,就把一些无用的信息用橡皮擦掉,这就是垃圾加收,即GC。
栈,打个比方,就像是这个翻译者的大脑,每次翻译,看到信息,在大脑里“缓存”一下。
当然,大脑里的数据,也就不用动态回收了,因为大脑可以短时记忆,下一次翻译,又重新“加载”新的信息。
简单来说,栈是随线程的,也就是线程私有的,根据程序上下文,来动态缓存数据的。就像每个翻译者,都有自己的大脑。都会用眼睛看一个英文单词,然后缓存在大脑。
而堆,是多线程共享的。就像每个翻译者都可以用同一张草稿纸来写字(当然,这个草稿纸要够大)。有同学说,大家都用一张草稿纸,会不会有冲突啊?
好问题!
这个工作室早想到这个问题!
解决方案就是:指定一个人专门拿橡皮擦,去动态清除无用的信息,并把有用的信息,抄写到固定的区域。
这个专门拿橡皮擦的人,就是GC线程,即垃圾回收器。
最后,说说执行引擎。
还是拿翻译工作室来比喻好了。
执行引擎,就是这个翻译工作室的业务员。他主要工作就是把翻译好的稿子,送给客户:操作系统。
让操作系统去执行这些稿子。这些稿子就是我们写的程序。从来完成java程序交给他们的工作。(这里java程序员,就是上帝的角色!)
并跟操作系统大BOSS交流沟通,讨价还价,打好关系。
当然,也是要从大BOSS里赚到钱和资源,才能养活这翻译工作室。
这些钱和资源,也就是操作系统里的:内存资源,CPU时间片资源,IO资源,网络资源。
以上,就是jvm运行时组件的主要组成和主要功能。
浅谈java虚拟机|系列2|JVM运行时的更多相关文章
- 浅谈java虚拟机|系列1|架构简介
今天开了一个专题.谈谈我们java程序员每天面对的java虚拟机(jvm). 本质上来说,jvm分两部分:编译器(compiler)和运行时(runtime). 所谓的编译器,简单来说,他就是个翻译机 ...
- 【java虚拟机系列】java虚拟机系列之JVM总述
我们知道java之所以能够快速崛起一个重要的原因就是其跨平台性,而跨平台就是通过java虚拟机来完成的,java虚拟机属于java底层的知识范畴,即使你不了解也不会影响绝大部分人从事的java应用层的 ...
- 【Java虚拟机】浅谈Java虚拟机
跨平台 Java的一大特性是跨平台,而Java是如何做到跨平台的呢? 主要依赖Java虚拟机,具体来说,是Java虚拟机在各平台上的实现. Java虚拟机在不同的平台有不同的实现.同一份字节码,通过运 ...
- 【java虚拟机系列】JVM类加载器与ClassNotFoundException和NoClassDefFoundError
在我们日常的项目开发中,会经常碰到ClassNotFoundException和NoClassDefFoundError这两种异常,对于经验足够的工程师而言,可能很轻松的就可以解决,但是却不一定明白为 ...
- 浅谈Java虚拟机内存中的对象创建,内存布局,访问定位
参考于 深入理解Java虚拟机 这里介绍HotSpot虚拟机(自带的虚拟机) 1.对象的创建 对于程序员来说,创建对象的方法: User user1 = new User(); User user2 ...
- 【java虚拟机系列】从java虚拟机字节码执行引擎的执行过程来彻底理解java的多态性
我们知道面向对象语言的三大特点之一就是多态性,而java作为一种面向对象的语言,自然也满足多态性,我们也知道java中的多态包括重载与重写,我们也知道在C++中动态多态是通过虚函数来实现的,而虚函数是 ...
- Java虚拟机系列一:一文搞懂 JVM 架构和运行时数据区
前言 之前写博客一直比较随性,主题也很随意,就是想到什么写什么,对什么感兴趣就写什么.虽然写起来无拘无束,自在随意,但也带来了一些问题,每次写完一篇后就要去纠结下一篇到底写什么,看来选择太多也不是好事 ...
- 浅谈Java代理一:JDK动态代理-Proxy.newProxyInstance
浅谈Java代理一:JDK动态代理-Proxy.newProxyInstance java.lang.reflect.Proxy:该类用于动态生成代理类,只需传入目标接口.目标接口的类加载器以及Inv ...
- 浅谈Java中的栈和堆
人们常说堆栈堆栈,堆和栈是内存中两处不一样的地方,什么样的数据存在栈,又是什么样的数据存在堆中? 这里浅谈Java中的栈和堆 首先,将结论写在前面,后面再用例子加以验证. Java的栈中存储以下类型数 ...
随机推荐
- Slider 滑块
通过拖动滑块在一个固定区间内进行选择 ¶基础用法 在拖动滑块时,显示当前值 通过设置绑定值自定义滑块的初始值 <template> <div class="block&qu ...
- java 对象转整数,两个整数相除转百分数
public class MathUtil { public static void main(String[] args) { System.out.println(toPercent(1,3)); ...
- oracle 12 安装
oracle 12 第二版本安装 下载地址 https://www.oracle.com/technetwork/cn/middleware/webcenter/content/downloads/ ...
- 跨域请求配置 Amazon AWS S3 腾讯云 阿里云 COS OSS 文件桶解决方案以及推荐 Lebal:Research
跨域请求配置 跨域请求指的就是不同的域名和端口之间的访问.由于 ajax 的同源策略影响.跨域请求默认是不被允许的. 使用@font-face外挂字体时,可能遇到跨域请求CROS问题:F12控制台报错 ...
- UniEAP Platform V5.0建库
create tablespace platform datafile 'platform.dbf' size 100M reuse autoextend on next 50M; . . drop ...
- Elastic Stack学习
原文链接 Elastic Stack简称ELK,在本教程你将学习如何快速搭建并运行Elastic Stack. 首先你要安装核心开源产品: Elasticsearch: Kibana: Beats: ...
- redhat7.5 替换yum源
Redhat 7自带的yum源需要付费注册,未注册情况下会报如下错误,且用yum repolist all检查源数目为0.这时候需要将RedHat 7自带的yum源 替换成CentOS 7免费源 解决 ...
- 访问DataGridView的Rows报了OutOfIndexRangeException错误
DataGridView绑定了一个List<Entity>实体集合,在遍历DataGridView的每一行DataBoundItem时候,如果符合某个条件的话,则移除List<Ent ...
- spark 常用设置
1.spark.hadoop.validateOutputSpecs 若设置为true,saveAsHadoopFile会验证输出目录是否存在.虽然设为false可直接覆盖文件路径
- 洛谷 P3368 树状数组 题解
题面 本题随便看两眼就知道该题满足了优美的查分性质: 对于在区间[x,y]内操作时,应该将查分数组的第x项和第y+1项进行相反操作: 询问答案时,问第i个数的值就是查分数组的前i项和: 暴力+玄学卡常 ...