还是我们上次的图,我们上次大概讲解了类加载子系统的执行过程,验证,准备,解析,初始化四个过程。还有我们的双亲委派机制。

我们这次来说一下运行时内存模型。上一段小代码。

public class Main {
public int compute() {
int a = 11;
int b = 22;
int c = a + b / 2;
return c;
} public static void main(String[] args) {
Main main = new Main();
int result = main.compute();
System.out.println(result);
System.out.println(2);
}
}

运行main方法时,再简单不过了,创建Main对象,调用compute方法,返回结果,打印,打印数字2。

那么这一系列过程在jvm里是怎么做的呢。我们来看一下。

1,为main方法开辟栈空间。

2,新建Main对象,放置在堆中。

3,开始运行compute对象,粗略的说开始计算

4,返回结果。

5,打印。

我再来详细的看一下内存模型内的栈到底是怎么工作的。

首先在栈空间内开辟一块空间,然后在空间内给予一个独立的main空间到栈底,在分配compute栈帧到栈,栈是先进后出的,切记。

我们在对于compute的栈帧空间放大化来看一下。

初始程序计数器为0也就是要运行第一行了,也就是说程序计数器就是控制代码该运行第几行的一个控制器。角标标识,从0开始。

int a = 11;就是首先将a放置在局部变量表中,(局部变量表如果需要存对象时,实则存储的是我们对象的引用)然后在操作数栈内生产11这个数字,再将11赋予a,则a=11放置在局部变量表内。并且计算过程是在操作数栈来做的。

方法出口是用来记录从哪里调用的,也就是方法出口指向了我们main方法。稍后去说我们的动态链接。

我们先来看一下我们的栈的大小,我们在程序启动时可以配置-xss=1M,这个1M其实每一个栈线程的大小,并不是代表全部的栈大小总和。

动态链接就是我们的一些列符号引用,当我们输入javap -v ***.class时,会生成一个常量池,#1,#2...都是一些符号引用的地址,这里把所有的参数名,方法名都可以理解为符号。

这样来说我们就把我们的栈,程序计数器,元空间之间的联系大概说了一遍。

我们在来看看我们的堆区

堆主要分为年轻代,老年代,元空间。年轻代又分为eden区,from区,to区。大概是8:1:1。一般来说堆的2/3是我们的老年代,并且我们暂时不需要考虑元空间,元空间现在已经使用的是真实内存,并不占用我们的jvm虚拟机内存。

新建的对象一律防放置在eden区上,当我们的eden放置满的时候,会触发我们的minorGC,清理到那些不可达对象,也就是不在有可能使用的对象。处理完成之后会放置在from区域,当下次eden再次满时,我们会连同我们的from区域一起进行minorGC,然后将处理后的对象放置在to区域,这时to区域会变为from区域,经过多次的monorGC都是可用的对象,我们会将该对象转译到老年代,也就是我们使用比较多的一直不能销毁的对象,当老年代满时候,这时,这时,这时会触发fullGC,这时会停止所有的服务,全力的来处理fullGC,这时我们的程序是不可能的,所以我们要减少我们的fullGC次数。又半夜了,下篇博客我们来说说,再来说说堆里面具体是用什么样的算法来清理垃圾的。同时也会简单的说一下,我们如何可以避免我们的fullGC。

最进弄了一个公众号,小菜技术,欢迎大家的加入

java架构之路-(JVM优化与原理)JVM的运行时内存模型的更多相关文章

  1. [转帖]java架构之路-(面试篇)JVM虚拟机面试大全

    java架构之路-(面试篇)JVM虚拟机面试大全 https://www.cnblogs.com/cxiaocai/p/11634918.html   下文连接比较多啊,都是我过整理的博客,很多答案都 ...

  2. java架构之路-(面试篇)JVM虚拟机面试大全

    下文连接比较多啊,都是我过整理的博客,很多答案都在博客里有详细说明,理解记忆是最扎实的记忆.而且我的答案不一定是最准确的,但是我的答案不会让你失望,而且几乎每个答案都是问题的扩展答案. 1.JVM内存 ...

  3. 关于JAVA中的static方法、并发问题以及JAVA运行时内存模型

    一.前言 最近在工作上用到了一个静态方法,跟同事交流的时候,被一个问题给问倒了,只怪基础不扎实... 问题大致是这样的,“在多线程环境下,静态方法中的局部变量会不会被其它线程给污染掉?”: 我当时的想 ...

  4. java架构之路-(mysql底层原理)Mysql之让我们再深撸一次mysql

    让我再深撸一次mysql吧,这次主要以应对面试来说说mysql,大概几个方向,索引结构,查询引擎,索引优化,explain的详解和trace工具的使用. 索引: 我们先来看一下mysql的B+tree ...

  5. java架构之路(mysql底层原理)Mysql之Explain使用详解

    上篇博客,我们详细的说明了mysql的索引存储结构,也就是我们的B+tree的变种,是一个带有双向链表的B+tree.那么我今天来详细研究一下,怎么使用索引和怎么查看索引的使用情况. 我们先来简单的建 ...

  6. java架构之路-(mysql底层原理)Mysql事务隔离与MVCC

    上几篇博客我们大致讲了一下mysql的底层结构,什么B+tree,什么Hash需要回行啊,再就是讲了mysql优化的explain,这次我们来说说mysql的锁. mysql锁 锁从性能上分为乐观锁( ...

  7. java架构之路-(mysql底层原理)Mysql索引和查询引擎

    今天我们来说一下我们的mysql,个人认为现在的mysql能做到很好的优化处理,不比收费的oracle差,而且mysql确实好用. 当我们查询慢的时候,我会做一系列的优化处理,例如分库分表,加索引.那 ...

  8. JVM运行时内存模型

    JDK1.7版本图 一,栈   基本数据类型的局部变量是直接保存在栈中. 栈帧:一个栈里面会包含多个栈帧,每一个栈帧代表一个方法的开始到结束,它涵盖了整个方法运行期间所有的操作和数据 栈帧 1:局部变 ...

  9. java架构之路-(JVM优化与原理)JVM类的加载机制

    话不多说,先上图. ***.class文件执行大概就是这样来走的.我们都知道我们的java文件经过编译以后会生成对应的class文件.先经过类装载子系统,然后塞进运行时内存模型的元空间,开始执行方法, ...

随机推荐

  1. python基础(21):异常处理

    1. 异常和错误 1.1 错误 程序中难免出现错误,而错误分成两种 1.1.1 语法错误 语法错误:这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正. #语法错误示范一 if ...

  2. python基础(10):文件操作

    1. 初识文件操作 使⽤python来读写⽂件是非常简单的操作.我们使⽤open()函数来打开⼀个⽂件,获取到⽂ 件句柄,然后通过⽂件句柄就可以进⾏各种各样的操作了,根据打开⽅式的不同能够执⾏的操 作 ...

  3. CAD画三维图怎么渲染?一分钟教你快速操作

    从事过CAD相关工作的都知道,CAD绘制的方式有二维平面图以及三维图形,三维图形,画三维图方式也是比较简单的.那当然三维图画完后一般还需要进行渲染操作,步骤也是比较简洁的.下面就来给大家操作一下CAD ...

  4. vue浏览器全屏实现

    1.项目中使用的是sreenfull插件,执行命令安装 npm install --save screenfull 2.安装好后,引入项目,用一个按钮进行控制即可,按钮方法如下: toggleFull ...

  5. 程序员的自我修养系列(一):优雅的代码管理工具之GitHub

    1.导言 代码管理是程序员经常遇到一个问题,很多童鞋将代码保存到本地硬盘,此种方法管理混乱,也存在代码丢失的风险,且版本无法控制,因此养成良好的代码管理习惯是程序员的必修课.在众多代码管理工具中笔者在 ...

  6. 【LeetCode】437. 路径总和 III

    437. 路径总和 III 给定一个二叉树,它的每个结点都存放着一个整数值. 找出路径和等于给定数值的路径总数. 路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点 ...

  7. 我认为现代IDE编辑器应该具有的几个特性和Visual studio 2010增强

    工作中要使用 VS 2010, 有好多年没有使用Visual studio 了, 试了一小会, 发现VS 2010 缺少不少现代IDE应有的特性, 我认为重要的是下面几个特性, VS2010 已经是1 ...

  8. 原生js利用data选择元素

    //js var a = document.querySelector('[data-word=a]') console.log(a) html <dl class="find-car ...

  9. [20190930]oracle raw类型转化number脚本.txt

    [20190930]oracle raw类型转化number脚本.txt --//写一个简单oracle raw转化number脚本,简单说明:--//输入必须是c1,02 或者 c102,不支持c1 ...

  10. [PHP] 近期接手現有的企邮前端框架业务所遇困难

    1.邮箱前端有三大产品线,包括免费邮箱,VIP邮箱,企业邮箱,使用的一套代码,在代码中进行的逻辑判断处理,根据不同的配置进行不同的业务操作.有很多逻辑是各产品线是不同的,需要仔细开发和判断才能不会影响 ...