当前位置: 首页 > news >正文

亲子游网站建设内容网络营销怎么推广

亲子游网站建设内容,网络营销怎么推广,如何建立起个人网站,广州建站公司网站前言: 你好,早上、中午、下午、晚上好。我是Java2B哥(微信搜Java2B)。一名无缘985,日常996工程师。 你们是不是非常的激动呀! 2B哥今天继续教大家JVM知识。这次章节为: 【金三银四-JVM系列】…

前言:

你好,早上、中午、下午、晚上好。我是Java2B哥(微信搜Java2B)。一名无缘985,日常996工程师。
你们是不是非常的激动呀!
在这里插入图片描述

2B哥今天继续教大家JVM知识。这次章节为:
【金三银四-JVM系列】CMS收集器与GC日志分析定位问题详解
【金三银四】JVM虚拟机CMS和G1收集器详解

图片

什么是JVM

相信很多小伙伴都非常熟悉了,JVM不就是虚拟机吗?那虚拟机又是什么了?不是JVM嘛!
这不废话嘛。

JVM可以说离我们既熟悉又陌生,很多朋友可能在工作中接触不到这块技术,但是在面试往往被问到(概率还蛮大),被问到了自认倒霉,死记硬背是没用的,到头来还是的忘,不过没有关系,今天你们遇到2B哥我,我这免费给大家说道说道JVM知识点,我要没让你明白算我输,你可以留言喷我,如果要是可以,你们也给我点个赞成不?别墨迹了 赶紧着吧。

ok,上货。此处应该有鲜花!❀❀❀❀❀❀❀❀

初识JVM:

图片

相信这张图大家都不陌生,这是整个Java体系,其中包括JDK.JRE.JVM三者的关系。

图中可以看得出来JRE包含了JVM,JDK包含了JRE。

从包含的角度就是: JDK是爷爷 JRE是父亲 JVM是儿子(如果觉得列子不太恰当)来看图

图片

我们来看代码:

public class App {private String name;private Object object = new Object();/**** 运算*/public int add() {int a = 1;int b = 2;int c = (a + b) * 100;return c;}/*** 程序入口*/public static void main(String[] args) throws InterruptedException {App app = new App();int result = app.add();System.out.println(result);}
}

图片图片

我们运行上述代码输出结果是300,虽然这个代码非常简单,这个时候已经涉及到JVM相关的知识了,在我们学Java基础的时候老师就告诉我们,Java是跨平台的,一次编写到处运行。

那Java是怎么做到跨平台的?继续看下图:

图片

通过此图大家就不难发现,我们编译的App.class文件可以在Windows操作系统运行也可以在Linux系统运行,但是两个系统底层的操作指令是不一样的,为了屏蔽底层指令的细节,起到一个跨平台的作用,JVM功不可没,我们常说Java是跨平台还不如说是Jvm跨平台(JRE运行时跨平台)。那Jvm虚拟机是怎么跨平台的?

JVM底层原理:

JVM底层由三个系统构成分别是:类加载、运行时数据区、执行引擎。

图片

我们今天重点讲解JVM运行时数据区(栈),其他两块可以关注我之前和后续文章。

我们App.class文件通过类加载子系统从硬盘中读取文件加载到内存中(运行时数据区)。

加载完成之后怎么处理了?(打个比喻 人吃饭 》吃到肚子里》各各器官负责自己工作吸收)

Stack栈:

先讲一下其中的一块内存区域虚拟机栈,大家都知道栈是数据结构,也是线程独有的区域,也就是每一个线程都会有自己独立的栈区域。我们运行App.java输出300就靠线程执行得来的结果。是哪个线程执行的?获取线程快照:“main线程”

栈》数据结构》存储内容》先进后出FILO

图片

大家都知道每个方法都有自己的局部变量,比如上图中main方法中的result,add方法中的a b c,那么java虚拟机为了区分不同方法中局部变量作用域范围的内存区域,每个方法在运行的时候都会分配一块独立的栈帧内存区域,我们试着按上图中的程序来简单画一下代码执行的内存活动。

图片

执行main方法中的第一行代码是,栈中会分配main()方法的栈帧,并存储math局部变量,,接着执行add()方法,那么栈又会分配add()的栈帧区域。

这里的栈存储数据的方式和数据结构中学习的栈是一样的,先进后出。当add()方法执行完之后,就会出栈被释放,也就符合先进后出的特点,后调用的方法先出栈。

栈帧:

栈帧内部“数据结构”主要由这几个部分组成:局部变量表、操作数栈、方法出口等信息。

图片

说了半天,栈帧到底干嘛用的呀?别急讲这个就会涉及到更底层的原理–字节码。我们先看下我们上面代码的字节码文件。

图片

APP.class文件看着像乱码,其实每个都是有对应的含义的,oracle官方是有专门的jvm字节码指令手册来查询每组指令对应的含义的。那我们研究的,当然不是这个。

jdk有自带一个javap的命令,可以将上述class文件生成一种更可读的字节码文件。

图片

图片

Compiled from "App.java"
public com.App {public com.App();Code:0: aload_01: invokespecial #1                  // Method java/lang/Object."<init>":()V4: aload_05: new           #2                  // class java/lang/Object8: dup9: invokespecial #1                  // Method java/lang/Object."<init>":()V12: putfield      #3                  // Field object:Ljava/lang/Object;15: returnpublic int add();Code:0: iconst_11: istore_12: iconst_23: istore_24: iload_15: iload_26: iadd7: bipush        1009: imul10: istore_311: iload_312: ireturnpublic static void main(java.lang.String[]) throws java.lang.InterruptedException;Code:0: new           #4                  // class com/App3: dup4: invokespecial #5                  // Method "<init>":()V7: astore_18: aload_19: invokevirtual #6                  // Method add:()I12: istore_213: getstatic     #7                  // Field java/lang/System.out:Ljava/io/PrintStream;16: iload_217: invokevirtual #8              // Method java/io/PrintStream.println:(I)V20: return
}

此时的jvm指令码就清晰很多了,大体结构是可以看懂的,类、静态变量、构造方法、add()方法、main()方法。
其中方法中的指令还是有点懵,我们举add()方法来看一下:

   Code:0: iconst_11: istore_12: iconst_23: istore_24: iload_15: iload_26: iadd7: bipush        1009: imul10: istore_311: iload_312: iretu

这几行代码就是对应的我们代码中add()方法中的四行代码。大家都知道越底层的代码,代码实现的行数越多,因为他会包含一些java代码在运行时底层隐藏的一些细节原理。
那么一样的,这个jvm指令官方也是有手册可以查阅的,网上也有很多翻译版本,大家如果想了解可自行百度。

执行流程:

设计代码中的部分指令含义:

第一步:压栈:

将int类型常量1压入操作数栈

0: iconst_1
就是将1压入操作数栈

图片

更正:执行流程过程中灰色背景“操作数栈”应改为“局部变量表”(!!!!!!!!!!)。

图片

第二步:存储:

将int类型值存入局部变量1

1: istore_1
局部变量1,在我们代码中也就是第一个局部变量a,先给a在局部变量表中分配内存,然后将int类型的值,也就是目前唯一的一个1存入局部变量a

图片

第三步:赋值

这两行代码就和前两行类似了。

   2: iconst_2 3: istore_2

图片

第四步:装载:

从局部变量2中装载int类型值

4: iload_1
5: iload_2
这两个代码是将局部变量1和2,也就是a和b的值装载到操作数栈中

图片

第五步:加法

执行int类型的加法

6: iadd
iadd指令一执行,会将操作数栈中的1和2依次从栈底弹出并相加,然后把运算结果3在压入操作数栈底。

图片

第六步:压栈:

将一个8位带符号整数压入栈

7: bipush 100
这个指令就是将100压入栈

图片

第七步:乘法:

执行int类型的乘法

9: imul
这里就类似上面的加法了,将3和100弹出栈,把结果300压入栈

图片

第八步:压栈:

将将int类型值存入局部变量3

10: istore_3
这里大家就不陌生了吧,和第二步第三步是一样的,将300存入局部变量3,也就是c

图片

第九步:装载:

从局部变量3中装载int类型值

11: iload_3
从局表变量3加载到操作数栈

图片

第十步:返回:

返回int类型值

12: ireturn

我们add方法是被main方法中调用的,所以通过方法出口返回到mian方法中result变量存储方法出口说白了不就是方法执行完了之后要出到哪里,那么我们知道上面add()方法执行完之后应该回到main()方法第三行那么当main()方法调用add()的时候,add()栈帧中的方法出口就存储了当前要回到的位置,那么当add()方法执行完之后,会根据方法出口中存储的相关信息回到main()方法的相应位置。看我图中的红线

图片

栈堆关系:

main方法中除了result变量还有一个app变量,app变量指向的是一个对象。那对象是怎么存储的?这儿要在说下局表变量表结构:基本类型和引用类型(Java叫引用C C++叫指针)

图片

关系就是:

图片

通过引用在栈中的app变量引用堆中的App对象

总结:

在这边跟大家分享一些一线大厂Java面试题,希望能给后续想要去面试阿里巴巴等一线互联网大厂的小伙伴一些帮助!学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。

下面这个链接,暗号: csdn 。加入即可获得。
点这个,点这个。

另外还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书。
在这里插入图片描述
讲到这儿相信大家对JVM栈执行原理是不是熟悉了?如果觉得不错欢迎点赞评论。原创不易

如果觉得作者的文章不错,欢迎关注我的微信:Java2B(一位日常996的工程师)。
在这里插入图片描述

http://www.wooajung.com/news/35015.html

相关文章:

  • 建设一个类似于京东的网站国家培训网官网
  • 平面设计周记100篇某网站seo策划方案
  • 无锡做网站 选众诺广州顶正餐饮培训学校
  • 网站建设 九艾bt磁力种子搜索引擎
  • 外国设计师素材网站全网优化哪家好
  • 便宜的网站制作seo软件代理
  • excel+表格+做的网站宁波抖音seo搜索优化软件
  • 建站之星7大核心价值铁岭网站seo
  • 移动端网站开发介绍百度网页制作
  • 微信公众号发布wordpress如何网页优化
  • 公司网站是怎么做的最佳磁力吧ciliba磁力链
  • 无锡锡山网站建设seo排名优化软件有用
  • 专业广州做网站公司网络营销ppt讲解
  • 网站布局软件网络营销的职能是什么
  • 平台期什么意思攀枝花seo
  • 国家住房部和城乡建设部 网站某网站seo诊断分析
  • 张掖专业做网站的公司免费发布信息
  • 做装修网站公司电脑培训
  • b2c购物网站系统软文写作的三个要素
  • 长葛做网站娱乐热搜榜今日排名
  • 网站建设营销型新闻营销
  • 寻求南宁网站建设人员威海seo优化公司
  • css网站开发站长统计app软件下载官网安卓
  • 哈尔滨专业优化网站个人南通百度网站快速优化
  • 福建泉州网站建设公司互联网营销师怎么考
  • 网站logo衔接西安高端网站建设公司
  • 网站建设公司推广方案百度推广多少钱一天
  • 后台网站如何建设南宁seo推广服务
  • 郑州专业做淘宝直播网站济南竞价托管
  • 东莞建网站的公司app开发公司