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

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

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几十行代码就能搞定

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 故事胶片 PS:如有需要Python学习资料的小伙伴可以加点击下方链 ...

  2. 怎样深入学习php,成为php高手!?

    本文章开头我想问一句话:PHP是做什么的? 因为这是面试中会问到的一个问题,虽然它看起来很简单,回答做网站的,也就是个简单建站的水平.回答做网站后端开发的,对PHP有了一定的认识,回答做后端处理的,有 ...

  3. FCC---Change Animation Timing with Keywords--两个小球从A都B,相同循环时间 duration, 不同的速度 speed

    In CSS animations, the animation-timing-function property controls how quickly an animated element c ...

  4. split("\\,")引起的java.lang.ArrayIndexOutOfBoundsException异常解决方案

    由split("\,")引起的指标越界异常 如果字符串最后分隔符里的字段为空,使用split("\\,")进行切割时,最后的空字段不会切割 例如"a, ...

  5. jira Licenses更新步骤

    有时候我们不想花钱使用jira,那么只有通过一个月以续期的方式来使用jira.下面提供下自己实测的方式 1.获取License Key 登录地址:https://my.atlassian.com 登录 ...

  6. CSS 轻松搞定标签(元素)居中问题

    在CSS里,标签位置居中一直是困扰Web前端的难题.在本文中,我对这类问题进行了探究和给出了几点建议,供读者参考. 1 行内标签 1.1 水平居中 在父级标签中使用 text-align: cente ...

  7. 具名插槽 slot (二)

    slot 是父组件与子组件的通信方式可以将父组件的内容显示在子组件当中或者说可以将 让你封装的组件变的更加的灵活,强壮! 在子组件中  通过为多个slot进行命名.来接受父组件中的不同内容的数据  这 ...

  8. bootstrap如何去除自带的样式----导航栏中的菜单实现平滑的过渡到对应的菜单区域-------动态跟换模态框中的内容

    问题1:如何去除bootstap中css中自带的overflow:hidden这个样式 今天遇见在bootstap中轮播图上的  附带图  片不能够显示出来,图片始终有一部分的高度  被隐藏了 后来通 ...

  9. c语言程序设计第1章

    开始记录自己学习c语言的过程,选用的教材是浙江大学何钦铭.颜晖编写的<c语言程序设计>(第3版). 一.第一个程序 /*求阶乘问题.输入一个正整数n,输出n!*/ #include< ...

  10. 25.Java基础_继承

    继承的格式(Java类) Java中继承的注意事项 继承的好处与弊端 继承中成员变量的访问特点(对public形式的变量来说) 继承中成员函数的访问特点 this和super: 继承中构造方法的访问特 ...