今天我们继续谈谈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运行时的更多相关文章

  1. 浅谈java虚拟机|系列1|架构简介

    今天开了一个专题.谈谈我们java程序员每天面对的java虚拟机(jvm). 本质上来说,jvm分两部分:编译器(compiler)和运行时(runtime). 所谓的编译器,简单来说,他就是个翻译机 ...

  2. 【java虚拟机系列】java虚拟机系列之JVM总述

    我们知道java之所以能够快速崛起一个重要的原因就是其跨平台性,而跨平台就是通过java虚拟机来完成的,java虚拟机属于java底层的知识范畴,即使你不了解也不会影响绝大部分人从事的java应用层的 ...

  3. 【Java虚拟机】浅谈Java虚拟机

    跨平台 Java的一大特性是跨平台,而Java是如何做到跨平台的呢? 主要依赖Java虚拟机,具体来说,是Java虚拟机在各平台上的实现. Java虚拟机在不同的平台有不同的实现.同一份字节码,通过运 ...

  4. 【java虚拟机系列】JVM类加载器与ClassNotFoundException和NoClassDefFoundError

    在我们日常的项目开发中,会经常碰到ClassNotFoundException和NoClassDefFoundError这两种异常,对于经验足够的工程师而言,可能很轻松的就可以解决,但是却不一定明白为 ...

  5. 浅谈Java虚拟机内存中的对象创建,内存布局,访问定位

    参考于 深入理解Java虚拟机 这里介绍HotSpot虚拟机(自带的虚拟机) 1.对象的创建 对于程序员来说,创建对象的方法: User user1 = new User(); User user2 ...

  6. 【java虚拟机系列】从java虚拟机字节码执行引擎的执行过程来彻底理解java的多态性

    我们知道面向对象语言的三大特点之一就是多态性,而java作为一种面向对象的语言,自然也满足多态性,我们也知道java中的多态包括重载与重写,我们也知道在C++中动态多态是通过虚函数来实现的,而虚函数是 ...

  7. Java虚拟机系列一:一文搞懂 JVM 架构和运行时数据区

    前言 之前写博客一直比较随性,主题也很随意,就是想到什么写什么,对什么感兴趣就写什么.虽然写起来无拘无束,自在随意,但也带来了一些问题,每次写完一篇后就要去纠结下一篇到底写什么,看来选择太多也不是好事 ...

  8. 浅谈Java代理一:JDK动态代理-Proxy.newProxyInstance

    浅谈Java代理一:JDK动态代理-Proxy.newProxyInstance java.lang.reflect.Proxy:该类用于动态生成代理类,只需传入目标接口.目标接口的类加载器以及Inv ...

  9. 浅谈Java中的栈和堆

    人们常说堆栈堆栈,堆和栈是内存中两处不一样的地方,什么样的数据存在栈,又是什么样的数据存在堆中? 这里浅谈Java中的栈和堆 首先,将结论写在前面,后面再用例子加以验证. Java的栈中存储以下类型数 ...

随机推荐

  1. Slider 滑块

    通过拖动滑块在一个固定区间内进行选择 ¶基础用法 在拖动滑块时,显示当前值 通过设置绑定值自定义滑块的初始值 <template> <div class="block&qu ...

  2. java 对象转整数,两个整数相除转百分数

    public class MathUtil { public static void main(String[] args) { System.out.println(toPercent(1,3)); ...

  3. oracle 12 安装

    oracle 12 第二版本安装 下载地址  https://www.oracle.com/technetwork/cn/middleware/webcenter/content/downloads/ ...

  4. 跨域请求配置 Amazon AWS S3 腾讯云 阿里云 COS OSS 文件桶解决方案以及推荐 Lebal:Research

    跨域请求配置 跨域请求指的就是不同的域名和端口之间的访问.由于 ajax 的同源策略影响.跨域请求默认是不被允许的. 使用@font-face外挂字体时,可能遇到跨域请求CROS问题:F12控制台报错 ...

  5. UniEAP Platform V5.0建库

    create tablespace platform datafile 'platform.dbf' size 100M reuse autoextend on next 50M; . . drop ...

  6. Elastic Stack学习

    原文链接 Elastic Stack简称ELK,在本教程你将学习如何快速搭建并运行Elastic Stack. 首先你要安装核心开源产品: Elasticsearch: Kibana: Beats: ...

  7. redhat7.5 替换yum源

    Redhat 7自带的yum源需要付费注册,未注册情况下会报如下错误,且用yum repolist all检查源数目为0.这时候需要将RedHat 7自带的yum源 替换成CentOS 7免费源 解决 ...

  8. 访问DataGridView的Rows报了OutOfIndexRangeException错误

    DataGridView绑定了一个List<Entity>实体集合,在遍历DataGridView的每一行DataBoundItem时候,如果符合某个条件的话,则移除List<Ent ...

  9. spark 常用设置

    1.spark.hadoop.validateOutputSpecs 若设置为true,saveAsHadoopFile会验证输出目录是否存在.虽然设为false可直接覆盖文件路径

  10. 洛谷 P3368 树状数组 题解

    题面 本题随便看两眼就知道该题满足了优美的查分性质: 对于在区间[x,y]内操作时,应该将查分数组的第x项和第y+1项进行相反操作: 询问答案时,问第i个数的值就是查分数组的前i项和: 暴力+玄学卡常 ...