浅谈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的栈中存储以下类型数 ...
随机推荐
- 介绍一下 NDK?
1.NDK 是一系列工具的集合 NDK 提供了一系列的工具,帮助开发者快速开发 C(或 C++)的动态库,并能自动将 so 和 java 应用一起打包成 apk.NDK 集成了交叉编译器,并提供了相应 ...
- 代码实现:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n
import java.util.Scanner; //编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n public ...
- Python学习之==>数组(一)
1.定义数组 city = [] # 定义一个空数组 name = ['Jack','Panda','Bob','Franck'] # 根据下标找元素,最前面一个元素的下标是0,最后一个元素下标是-1 ...
- 【SSM】---Spring+SpringMVC+Mybatis框架整合
参考 百度经验 https://jingyan.baidu.com/article/2a1383288a85a9074a134f1b.html CSDN http://blog.csdn.net/ge ...
- No repository found containing: …错误解决
由于我安装的是Eclipse ForJava Development,无JAVA EE,查找资料后发现可以自己在已有软件的基础上配置,总结如下: >>>>>点开之后,找到 ...
- k8s-kubernettes-sercet存储
Secret Secret存在意义 Secret解决了密码.token.密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者Pod Spec中.Secret可以以Volume或者环境变量的方 ...
- java集群技术(转)
序言 越来越多的关键应用运行在J2EE(Java 2, Enterprise Edition)中,这些诸如银行系统和账单处理系统需要高的可用性(High Availability, HA),同时像Go ...
- C++中的new/delete、构造/析构函数、dynamic_cast分析
1,new 关键字和 malloc 函数区别(自己.功能.应用): 1,new 关键字是 C++ 的一部分: 1,如果是 C++ 编译器,则肯定可以用 new 申请堆空间内存: 2,malloc 是由 ...
- MySQL数据库创建时间和更新时间错乱问题
在数据中勾选create_time和update_time不为空可以解决更新记录时,create_time也被更新的毛病
- allure 这么高大上的测试报告环境,5 分钟搞定
allure 的测试报告是老板喜欢的样子.如果能用上 allure,干嘛还选择其他的测试报告类型呢?python 的 pytest 单元测试框架有 allure 的插件,可以很方便的在 python ...