jvm 简单描述

java零基础入门-面向对象篇(一) 基础类型和引用类型
友情提示:本章开始可能会有部分较深入的内容,不说又不行,说了又很难解释清楚,因为里面的技术细节实在太多太复杂,所以我会屏蔽部分技术细节,只展示当前需要了解的基础知识,避免出现讲了半天还是没人懂的情况。随着我们的知识增长,后面会逐步的将细节补充完整。
学习编程,一定要把思路放开,不能太局限,多多进行思维能力的锻炼才能提高自己的内功。比如我们很常见的买房啊,哪里修商场啊,其实跟我们的内存结构是很类似的。他们都涉及到一个资源规划的问题,来吧,一起来锻炼下思维能力吧。
最近全国除了最火的抢人大战,其实前段时间还有一个东西很火,那就是城市规划。比如我们的首都北京,选择了雄安进行首都功能疏解,其实很多城市都有类似的规划,比如天津滨海新区,深圳前海新区等等。政府设立了一个即将开发的新区后,会干嘛?招商引资,首先是大的企业进来修路盖高楼大厦,然后修住宅,再卖给老百姓。我们来看看具体过程。
首先,政府画了一个圈,“走过路过不要错过哈,新鲜出炉的地块,各种优惠政策,减税减税再减税,快来看看啊~”,然后一堆大企业蜂拥而上,“给我留一块~”,“我也要~”。然后各种大企业开始修办公楼啊,房地产开发商开始修海景房啊,然后轮到地产开发商要喝了,“走过路过不要错过啊,海景房值得拥有,机不可失,抢到了幸福生活,没抢到继续干活~”。然后轮到抢房大军蜂拥而上了。
给我房!!!
再来看看电脑内存,其实我们的电脑就是政府部门,每一次一开机,就开始要喝,“内存开始大派送啦,需要的快来领啊”,然后各种开机启动的应用程序开始抢内存,什么聊天的啊,杀毒的啊,浏览器啊,当然还有系统自带的功能,统统需要内存。当然,内存不是一开机就分完了的,还有很多是我们启动了新的应用程序才会划分内存给你,比如我们的java。
应用程序和系统程序占用内存
电脑开机进行的内存免费大派送跟我们的政府规划很像,在座的各位都是大佬,内存要多少有多少。然后我们打开java的时候,java也成功的分到了一块内存空间。java这个房地产商跟别的有点区别,他很牛,拿的地很大,他要自己规划自己的地,也就是说它不仅仅要做房地产,他还要修商场,建公园,这个就厉害了~
java虚拟机
看见没有,系统给了一块内存java ,然后他在自己的一亩三分地上,开始干自己的规划了,这是个很高级的房产开发商。java有个名词叫java虚拟机(JVM),你就可以理解为他是一个虚拟的系统,他干了很多和系统类似的活,系统把内存交给java以后,就由 jvm 来负责规划内存。就像我们上面说的,政府部门划了地给开发商,java自己也划地分给他下面的小弟。那么java里面的小弟又是啥?继续往下看
首先我们看看普通人眼里的内存,他就是一块绿色的板子,上面有很多电路,下面有一条金光闪闪的东西,好了,理解完了。
普通人看内存
再来看看硬件工程师眼里的内存,他就是各种电路啊,电容啊,门啊之类的东西,其实我也不是很懂,大概是这样。
硬件工程师看内存
接下来看软件工程师眼里的内存,这个图是指分给java的内存,也就是jvm管理的内存。我们只看java这个开发商,自己已经分到的内存,其他软件,系统占用的内存我们不去管他。我们看到 jvm 划分的内存大概有以下这么几个区域:本地方法栈,虚拟机栈,程序计数器,堆,方法区,这些就是 java 自己的小弟了。
jvm内存
我们看看这些颜色是咋回事,和上面的规划图颜色说明差不多,红色的是 堆,可以理解成商业用地,绿色的是方法区,可以理解成公园,这两个区域的特点是,他们是公共用地,不管哪个小区的居民,都可以来压压马路,看看风景。再看上面的,本地方法栈和程序计数器是灰色,你可以理解为市政设施,每个片区都有警察局,有困难找警察叔叔,我们姑且不去管他,知道就行了。主要看看 虚拟机栈,这个下面简称为栈,这个很重要。我们可以理解成居民小区,每个人只能出入自己的小区,去别人小区可不行,保安不让进。
所以总结一下,堆和方法区是公共的,每个小区的居民都可以去玩,而栈是私有的,不能随便串门的。这个理解到这里就行了。接下来我们讲讲最重要的 栈 和 堆,方法区就是个大草地,暂时不用管他。
基础类型 和 引用类型
我们首先明确一个观念,我们的数据都是存在内存里的,但是不同的数据,在内存中存放的区域是不同的。有的数据存放在栈,有的数据存放在堆。具体谁放在哪,我们首先要明确数据的类型。
基础类型(又叫值类型):我前面讲的都是基础类型,byte,short,int,long,float,double,boolean,char,基础类型全部存在栈里面。
引用类型:数组,类,接口,引用类型变量存在栈,对象存在堆,通过引用确定关系。
基础类型比较好理解,创建的时候往栈里面一丢,搞定,打完收工。而引用类型就比较复杂了,引用类型的变量就是引用,啥叫引用?来吧,话不多,懵的时候就上图
内存地址
好吧,肯定有同学又要问,内存地址又是个啥?
内存地址
地址就是找人找东西时候用的,内存地址就是让内存划分的空间有个标记,我通过这个标记可以找到内存。所以引用类型里面存的不是你定义给他的值,而是存的内存地址。那我定义的数组啊,数组跑哪去了?它在堆里面,而这个栈里面存的地址就是堆里面放的那个数组的地址。又懵了?图图图~
地址
我们将红色箭头干的事,叫做:引用变量指向内存。堆里面的数据,只有当有引用变量指向它的时候,才能存在,如果没人指向堆里面的数据了,就会有一位亲切的清洁工阿姨把他当垃圾处理掉。所以栈里面的变量,红色箭头,堆里面的数据这三个东西是一体的,他们不能分开。他们在一起,才是定义了一个完整的引用类型。
其实这一段对于初学者来说是有难度的,概念比较多,步骤繁琐,图也都是平面图,有没有更加通俗易懂的方式来解释这个问题呢,来吧,本教程独家三维图双手奉上。
栈
栈是一种数据结构,他的特点就是先进后出,后进先出。只有栈顶可以操作,栈底是固定的,插入操作又叫入栈,删除叫出栈。理解这么多就可以了。
栈结构
入栈
出栈
堆
相对于栈的有序,堆是无序的,可以理解成随机划分一块空间来储存对象。
堆是无序的
我们用三维图再来看看刚才的例子
首先是基础类型
定义变量
入栈
再来看引用类型
定义变量
开辟空间,建立引用
本篇文章为接下来的数组,类打基础,堆和栈的理解对我们更好的学面向对象很有帮助,请好好理解,多多参悟。
jvm 简单描述的更多相关文章
- JAVA 文件编译执行与虚拟机(JVM)简单介绍
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytpo3 java程序的内存分配 JAVA 文件编译执行与虚拟机(JVM)介绍 ...
- Java中会存在内存泄露吗?请简单描述。
本文转载自:Java中会存在内存泄漏吗,请简单描述 会.java导致内存泄露的原因很明确:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周 ...
- 简单描述RAID级别:
简单描述RAID级别: RAID 0 是俩盘一起读写,如果一个坏了那么数据全丢失: RAID 1是一块写,一块用来备份,坏一块无所谓: RAID 2 ,3 ,4 不常用: 最常用的就是RAID 5和R ...
- ECSHOP购物车页面显示商品简单描述
1.这里说的商品简单描述,不是商品的详细信息,而是后台编辑商品时在“其他信息”标签栏填写的那个“商品简单描述”,即goods_brief字段 2.修改lib_order.php文件的get_cart_ ...
- TCP/IP 协议标准简单描述
TCP/IP 协议标准简单描述 说明 分为三部分:中文名称.缩写.说明. 应用层 DNS 域名服务 (DNS) 功能: 将域名转化为IP地址 BOOTP 引导程序协议 (BOOTP) 功能: 允许无盘 ...
- LINQ架构简单描述
写在前面的话:课堂上老师只是简单提了一下LINQ,当时听着老师对它的描述,感觉非常神奇,不用去操作繁琐的SQL语句了,读取数据库的操作居然能向写C#代码一样方便,但是一直没有机会去学习使用它. LIN ...
- [answerer的算法课堂]简单描述4种排序算法(C语言实现)
[answerer的算法课堂]简单描述4种排序算法(C语言实现) 这是我第一次写文章,想要记录自己的学习生活,写得不好请包涵or指导,本来想一口气写好多种,后来发现,写太多的话反而可读性不强,而且,我 ...
- salesforce 零基础学习(三十七) DML及Database方法简单描述
在apex中通过soql查询可以使用两种方式,使用DML语句或者使用Database的方法. 使用DML语句和使用Database类的方法对于我们来说用的都很多,并且都很常见.对于数据库常见的操作:增 ...
- iterator简单描述
Item 26. Prefer iterator to const iterator, reverse_iterator, and const_reverse_iterator. 上面一段话,是< ...
随机推荐
- Git-起步
Git命令行 只要输入git,Git就会不带任何参数地列出它的选项和最常用的子命令. 要得到一个完整的git子命令列表,可以输入git help --all 显示版本号 git --version 每 ...
- 数据库路由中间件MyCat - 使用篇(1)
此文已由作者张镐薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 基本概念 直接介绍概念太枯燥了,还是拿个和背景篇相似的例子介绍 业务场景:客户完成下单,快递员接受并更新运单 ...
- Windows网络编程笔记6 --- WinSock I/O 控制方法
Windows提供了两种方式“套接字模式”和“套接字I/O模型”,可对一个套接字上的I/O行为加以控制.套接字模式用于决定在随一个套接字调用时,那些 Winsock函数的行为.其中的模型包括括sele ...
- tomcat源码分析一
废话少说,拉代码,导入eclipse开干,具体步骤可以参考http://hi.baidu.com/hateeyes/blog/item/7f44942a20ad8f9d023bf66d.html 下面 ...
- selenium webdriver——多表单切换与多窗口切换
多表单切换 >>在Web应用中经常会遇到frame/iframe表单嵌套页面的应用,WebDriver只能在一个页面上对元素识别与定位,对于frame/iframe 表单内嵌页面上的元素无 ...
- Event Loop详解
1.进程,单线程与多线 进程: 运行的程序就是一个进程,比如你正在运行的浏览器,它会有一个进程. 线程: 程序中独立运行的代码段. 一个进程由单个或多个线程组成,线程是负责执行代码的. 2.单线程与多 ...
- AngularJs 特性 之 MVC
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script sr ...
- NSByteCountFormatter
可以将字节转化为我们需要的Kb或者m + (NSString *)stringFromByteCount:(long long)byteCount countStyle:(NSByteCountFor ...
- 在npm当中发布自己的包的方法
首先需要一个注册一个npm账号,注意,必须验证邮箱,不然是无法发布包的!下面是当时的报错 接着在你需要发布的包的文件夹下面打开你的cmd或者其他的命令行输入工具 输入 npm init 初始化你的 ...
- Scrapy安装报错 Microsoft Visual C++ 14.0 is required 解决办法
Scrapy安装报错 Microsoft Visual C++ 14.0 is required 解决办法原因:Scrapy需要的组 twisted 需要 C++环境编译. 方法一:根据错误提示去对应 ...