JVM基础快速入门篇

Java是一门可以跨平台的语言,但是Java本身是不可以实现跨平台的,需要JVM实现跨平台。javac编译好后的class文件,在Windows、Linux、Mac等系统上,只要该系统安装对应的Java虚拟机,class文件都可以运行。达到”一次编译,到处运行”的效果。

一、JVM是什么?

而JVM到底是什么呢?引用百度百科对JVM的介绍:

JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

二、JVM架构知识

1.JVM主要包含类装载器、运行时数据区(内存模型)、执行引擎。里面内存模型有可以细分包括本地方法栈、堆、栈(线程)、方法区(元空间)、程序计数器。如图所示:

1.类装载器的作用就是负责加载class文件,class文件在文件开头有特定的文件标示,将class文件字节码内容加载到内存中,并将这些内容转换成方法区中的运行时数据结构并且ClassLoader只负责class文件的加载,至于它是否可以运行,则由执行引擎(Execution Engine)决定。类加载器又有四大类加载器:

  • 启动类加载器(Bootstrap ClassLoader):负责加载JRE核心类库,像JRE中的rt.jar等(C/C++);
  • 扩展类加载器(Extension ClassLoader):负责加载JRE扩展目录ext中的jar包;
  • 系统类加载器(Application ClassLoader):负责加载ClassPath路径下的类包;
  • 自定义的类加载器(User ClassLoader):只加载指定目录下的jar和class,想加载其它位置的类或jar时得自行定义类加载器;

2.JVM中,对象都是在堆中分配内存空间的,栈只用于保存局部变量和临时变量,如果是对象,只保存引用,实际内存还是在堆中。栈的特点是先进后出,假设一个main方法,里面执行了一个方法,我们是后执行的那个方法即那个线程,但是执行完毕后,那个线程是先销毁的。每个方法在执行的同时都会创建一个栈帧,用于存储局部变量表(存放局部变量的)、操作数栈(存放需要运算的数据)、动态链接、方法出口(执行完方法 回到main方法的位置)等信息,每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机中入栈到出栈的过程。即一个方法对应一块栈帧内存区域(存放本方法的局部变量)。

3.方法区存储已被虚拟机加载的类信息、常量(堆中的对象常量地址)、静态变量、即时编译器编译后的代码等数据。

4.本地方法栈和栈的作用类似,但是它服务的对象是native方法,该方法得由c语言来实现。

5.程序计数器作用是当CPU多线程切换的时候,切回到当前线程的时候,回到程序计数器计数的位置,继续执行。

三、堆内存的结构模型

新生代包括Eden加上2个survivor区,执行minor gc之后,大多数的对象会被回收,活着的进入s0,再次minor gc,活着的对象eden+s0->s1,再次minor gc,eden+s1->s0…这里虚拟机采取了分代收集的思想来管理内存,JVM给每个对象一个对象年龄计数器,分代年龄达到15后即对象被执行了15次minor gc后移入老年代。除此之外,s区装不下的大对象也会直接进入老年代。

最后,老年代存的就是一些大对象和需要连续内存空间的对象(静态变量、缓存、线程池等),老年代满了的话,会执行Full GC垃圾收集。官网对Full GC的解释中介绍了个词”Stop-The-World”,它会把所有的应用线程停掉,这时候系统会卡掉。JVM虚拟机调优的目标就是减少full gc即减少STW。

四、垃圾回收机制

堆里面存放new的对象和数组,Java优于其他语言一个很重要的原因就是它能自动处理垃圾对象,也就是有垃圾回收机制(GC)。有了垃圾回收机制有几点好处编程简单,系统不容易出错。

1.什么是垃圾?

我们把没有任何引用指向的对象或者一堆对象(循环引用)定义为垃圾。

2.系统如何定位垃圾

  • 引用计数算法-简单且高效但是主流的Java虚拟机里并没有选用引用计数算法来管理内存,因为它不能解决循环引用的问题。
  • 根可达分析算法-将”GC Roots”对象作为起点,从这些节点开始向下搜索引用的对象,找到的对象都标记为非垃圾对象,其余未标记的对象都是垃圾对象。线程栈的本地变量、静态变量、本地方法栈的变量等等都可以称作GC Roots跟节点。如图:

3.常见的垃圾回收算法

  • 复制算法-没有碎片 浪费内存空间(目前使用新生代使用的是复制算法)
  • 标记清除-位置不连续 产生内存碎片
  • 标记压缩-没有碎片 效率偏低

复制算法它将可用内存按容量分为大小相等的两块,每次只使用其中的一块,当这一块的内存用完了,就将还存活的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。

五.常见垃圾回收器

新生代收集器:Serial、ParNew、Parallel Scavenge
老年代收集器:CMS、Serial Old、Parallel Old
整堆收集器: G1

jdk1.8 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)

原文地址:https://www.cnblogs.com/asdgjk/p/12275380.html

时间: 2024-10-13 03:04:42

JVM基础快速入门篇的相关文章

Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 2. 变量

大家在中学就已经学过变量的概念了.例如:我们令 x = 100,则可以推出 x*2 = 200 试试下面这段 Python 代码 1 import turtle 2 3 turtle.shape("turtle") 4 x = 100 5 turtle.forward(x) 6 turtle.left(45) 7 turtle.forward(2*x) 8 9 turtle.exitonclick() 运行上面的代码,小海龟将画出下面的图案 x = 100 声明了变量 x,并将它赋值为

零基础快速入门web学习路线(含视频教程)

下面小编专门为广大web学习爱好者汇总了一条完整的自学线路:零基础快速入门web学习路线(含视频教程)(绝对纯干货)适合初学者的最新WEB前端学习路线汇总! 在当下来说web前端开发工程师可谓是高福利.高薪水的职业了.所以现在学习web前端开发的技术人员也是日益增多了,但是在学习web前端开发中盲目的去学习而没有一个完整的思路和学习路线也是不行的. 成为一个合格的web前端开发工程师的具备什么条件? 熟练的掌握HTML.CSS.JS.JQ等最基本的技术. 现在,只掌握这些已经远远不够了.无论是开

六、华为IP基础快速入门之RIP协议

六.华为IP基础快速入门之RIP协议 1.本章学习目标 2.课程内容 3.了解什么是路由 4.RIP协议概述:RIP(Routing Information Protocol,路由信息协议)是一种内部网关协议(IGP),是一种动态路由选择协议,用于自治系统(AS)内的路由信息的传递.RIP协议基于距离矢量算法(DistanceVectorAlgorithms),使用"跳数"(即metric)来衡量到达目标地址的路由距离.这种协议的路由器只关心自己周围的世界,只与自己相邻的路由器交换信息

小D课堂 - 零基础入门SpringBoot2.X到实战_第1节零基础快速入门SpringBoot2.0_1、SpringBoot2.x课程介绍和高手系列知识点

1 ======================1.零基础快速入门SpringBoot2.0 5节课 =========================== 1.SpringBoot2.x课程全套介绍和高手系列知识点     简介:介绍SpringBoot2.x课程大纲章节         java基础,jdk环境,maven基础 2.SpringBoot2.x依赖环境和版本新特性说明 简介:讲解新版本依赖环境和springboot2新特性概述 1.依赖版本jdk8以上, Springboot2

Expression Blend实例中文教程(7) - 动画基础快速入门Animation

通过前面文章学习,已经对Blend的开发界面,以及控件有了初步的认识.本文将讲述Blend的一个核心功能,动画设计.大家也许注意到,从开篇到现在,所有的文章都是属于快速入门,是因为这些文章,都是我曾经学习的经验和工作中使用到的经验总结出来的.在我个人认为,掌握了这些核心功能也就等于掌握了Blend的开发方法.在以后开发项目中使用Blend开发工具,这些知识应该足够用了.当然,特殊项目也需要特殊对待,如果您在项目开发中,有新的Blend开发经验,希望您能够毫不吝啬的分享,在这里,我表示深深的谢意.

Elasticsearch顶尖高手系列-快速入门篇

01.课程介绍02.用大白话告诉你什么是Elasticsearch03.Elasticsearch的功能.适用场景以及特点介绍04.手工画图剖析Elasticsearch核心概念:NRT.索引.分片.副本等05.在windows上安装和启动Elasticseach06.快速入门案例实战之电商网站商品管理:集群健康检查,文档CRUD07.快速入门案例实战之电商网站商品管理:多种搜索方式08.快速入门案例实战之电商网站商品管理:嵌套聚合,下钻分析,聚合分析09.手工画图剖析Elasticsearch

Spring基础 快速入门spring boot(2) SPRING INITIALIZR

SPRING INITIALIZR是spring boot在构建项目时候非常有效, 虽然说Maven以及Spring boot提供的starter使用起来非常简单, 但是由于组件和关联部分众多,有这样一个可视化的配置构建管理工具仍然很不错. 在这篇文章中我们将会在IntelliJ IDEA中利用SPRING INITIALIZR来创建一个Hello World的例子程序, 不包括Maven下载的速度的话, 1分钟应该够了. 创建一个SPRING INITIALIZR项目 使用IntelliJ I

Kubernetes零基础快速入门!初学者必看!

起源 Kubernetes 源自于 google 内部的服务编排系统 - borg,诞生于2014年.它汲取了google 十五年生产环境的经验积累,并融合了社区优秀的idea和实践经验. 名字 Kubernetes 这个名字,起源于古希腊,是舵手的意思,所以它的 logo 即像一张渔网又像一个罗盘,谷歌选择这个名字还有一个深意:既然docker把自己比作一只鲸鱼,驮着集装箱,在大海上遨游,google 就要用Kubernetes去掌握大航海时代的话语权,去捕获和指引着这条鲸鱼按照主人设定的路线

零基础快速入门Java的秘诀

刚开始学习Java时要端正自己的学习的目标和态度,明确学习Java基础重点要做什么. 首先第一点,Java基础的学习,基础很重要,基础好地基牢,才能爬的高! 大家要从以下4个方向努力: 代码能力:一定要敲代码,不管多简单的代码,一定要自己敲一遍. 面向对象分析能力:Java是面向对象的语言,面向对象理解的越深刻,Java基础掌握的越好,是核心的能力. 内存底层和源码分析习惯:刚开始学习的时候也要了解Java底层是如何运行的,养成看源码的习惯,进步会很快. 调试和查错能力:尤其在工作中,特别重要.