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(老年代)

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

  1. Java基础-SSM之Spring快速入门篇

    Java基础-SSM之Spring快速入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.    Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java ...

  2. Java基础-SSM之mybatis快速入门篇

    Java基础-SSM之mybatis快速入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 其实你可能会问什么是SSM,简单的说就是spring mvc + Spring + m ...

  3. Hadoop生态圈-Hive快速入门篇之HQL的基础语法

    Hadoop生态圈-Hive快速入门篇之HQL的基础语法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客的重点是介绍Hive中常见的数据类型,DDL数据定义,DML数据操作 ...

  4. Hadoop基础-MapReduce入门篇之编写简单的Wordcount测试代码

    Hadoop基础-MapReduce入门篇之编写简单的Wordcount测试代码 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本文主要是记录一写我在学习MapReduce时的一些 ...

  5. 私有仓库GitLab快速入门篇

    私有仓库GitLab快速入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 安装文档请参考官网:https://about.gitlab.com/installation/#ce ...

  6. Hadoop生态圈-大数据生态体系快速入门篇

    Hadoop生态圈-大数据生态体系快速入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.大数据概念 1>.什么是大数据 大数据(big data):是指无法在一定时间 ...

  7. Hadoop生态圈-Hive快速入门篇之Hive环境搭建

    Hadoop生态圈-Hive快速入门篇之Hive环境搭建 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据仓库(理论性知识大多摘自百度百科) 1>.什么是数据仓库 数据 ...

  8. [易学易懂系列|rustlang语言|零基础|快速入门|(22)|宏Macro]

    [易学易懂系列|rustlang语言|零基础|快速入门|(22)|宏Macro] 实用知识 宏Macro 我们今天来讲讲Rust中强大的宏Macro. Rust的宏macro是实现元编程的强大工具. ...

  9. [易学易懂系列|rustlang语言|零基础|快速入门|(20)|错误处理]

    [易学易懂系列|rustlang语言|零基础|快速入门|(20)|错误处理] 实用知识 错误处理 我们今天来讲讲Rust中的错误处理. 很多语言都有自己的错误处理方式,比如,java是异常处理机制. ...

随机推荐

  1. linux 没有音频输出的解决方式

    用户级别的-/.asoundrc 文件. 如果文件不存在,可以手动创建. 其中的各个 ID,请根据实际情况调整: defaults.pcm.card 1 defaults.pcm.device 0 d ...

  2. $loj10156/$洛谷$2016$ 战略游戏 树形$DP$

    洛谷loj Desription Bob 喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的方法.现在他有个问题. 现在他有座古城堡,古城堡的路形成一棵树.他要在这棵树的节点上放置最少数 ...

  3. .NET设计篇08-线程统一取消模型和跨线程访问UI

    知识需要不断积累.总结和沉淀,思考和写作是成长的催化剂,输出倒逼输入 内容目录 一.线程统一取消模型1.取消令牌2.可以中断的线程1.设计一个中断函数2.创建CancellationTokenSour ...

  4. selenium自动化测试之--验证码处理

    由于登录反爬措施的越来越麻烦,甚至出现了12306这种看图识物的无敌验证码,我只能说,我选择死亡.这就衍生出了使用selenium来获取获取cookies. 因为经常会出现验证码,导致我们ui自动化测 ...

  5. Codeforces Round #609 (Div. 2)前五题题解

    Codeforces Round #609 (Div. 2)前五题题解 补题补题…… C题写挂了好几个次,最后一题看了好久题解才懂……我太迟钝了…… 然后因为longlong调了半个小时…… A.Eq ...

  6. 《图解机器学习-杉山将著》读书笔记---CH3

    CH3 最小二乘学习法 重点提炼 提出最小二乘学习法的缘故: 最小二乘学习法公式 对不同模型进行最小二乘法学习,得到最小二乘公式中的参数theta: 1.线性模型   代入3.1公式,对参数求偏导,偏 ...

  7. 《图解机器学习-杉山将著》读书笔记---CH1

    CH1 什么是机器学习 重点提炼 机器学习的种类: 常分为:监督学习.无监督学习.强化学习等 监督学习是学生从老师那获得知识,老师提供对错指示 无监督学习是在没有老师的情况下,学生自习 强化学习是在没 ...

  8. Ceph 文件系统-全网最炫酷的Ceph Dashboard页面和Ceph监控 -- <5>

    Ceph Dashboard实现 Ceph Dashboard介绍 Ceph 的监控可视化界面方案很多----grafana.Kraken.但是从Luminous开始,Ceph 提供了原生的Dashb ...

  9. Java面向对象之异常【一】

    目录 Java面向对象之异常[一] 异常的继承体系 Error Exception 异常是否受检 unchecked exceptions(不受检异常) checked exceptions(受检异常 ...

  10. linux入门系列5--新手必会的linux命令

    上一篇文章"linux入门系列4--vi/vim编辑器"我们讨论了在linux下如何快速高效对文本文件进行编辑和管理,本文将进一步学习必须掌握的linux命令,掌握这些命令才能让计 ...