ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

1、初始JVM

2022-05-11 01:02:32  阅读:284  来源: 互联网

标签:Java 虚拟机 永久 内存 JVM Java8 初始


一、什么是JVM

1.1 什么是JVM

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

主流虚拟机

虚拟机名称 介绍
HotSpot Oracle/Sun JDK和OpenJDK都使用HotSPot VM的相同核心
J9 J9是IBM开发的高度模块化的JVM
JRockit JRockit 与 HotSpot 同属于 Oracle,目前为止 Oracle 一直在推进 HotSpot 与 JRockit 两款各有优势的虚拟机进行融合互补
Zing 由Azul Systems根据HostPot为基础改进的高性能低延迟的JVM
Dalvik Android上的Dalvik 虽然名字不叫JVM,但骨子里就是不折不扣的JVM

1.2 JVM与操作系统

Java 是一门抽象程度特别高的语言,提供了自动内存管理等一系列的特性。这些特性直接在操作系统上实现是不太 可能的,所以就需要 JVM 进行一番转换。

image-20220511002503390

从图中可以看到,有了 JVM 这个抽象层之后,Java 就可以实现跨平台了。JVM 只需要保证能够正确执行 .class 文 件,就可以运行在诸如 Linux、Windows、MacOS 等平台上了。

应用程序、JVM、操作系统之间的关系

image-20220511002556484

我们用一句话概括 JVM 与操作系统之间的关系:JVM 上承开发语言,下接操作系统,它的中间接口就是字节码。

1.3 JVM、JRE、JDK 的关系

image-20220511002630412

JVM 是 Java 程序能够运行的核心。但是需要注意,JVM 自己什么也干不了,你需要给它提供生产原料(.class 文 件)

JRE(Java Runtime Environment): JVM 标准加上实现的一大堆基础类库,就组成 了 Java 的运行时环境

JDK(Java Development Kit):除了 JRE,JDK 还提供了一些非常好用的小工具,比如 javac、java、jar 等。它 是 Java 开发的核心,让外行也可以炼剑!

image-20220511002840957

二、 java虚拟机的内存管理

2.1 JVM整体架构

JVM 内存共分为: 虚拟机栈方法区本地方法栈、`PC程序计数器、五个部分

image-20220511003142724

JVM分为五大模块:类装载子系统运行时数据区执行引擎本地方法接口和垃圾回收模块

image-20220511003333577

2.2 JVM运行时内存

Java 虚拟机有自动内存管理机制,如果出现面的问题,排查错误就必须要了解虚拟机是怎样使用内存的

image-20220511003515620

2.2.1 Java7和Java8内存结构的不同主要体现在方法区的实现

JDK7 内存结构

image-20220511003552404

JDK8 的内存结构

image-20220511003609668

JDK8虚拟机内存详解

image-20220511003631216

JDK7和JDK8变化小结

image-20220511003657643

2.3 面试题

对于Java8,HotSpots取消了永久代,那么是不是就没有方法区了呢?

当然不是,方法区只是一个规范,只不过它的实现变了。

在Java8中,元空间(Metaspace)登上舞台,方法区存在于元空间(Metaspace)。同时,元空间不再与堆连续,而且是 存在于本地内存(Native memory)

方法区Java8之后的变化

  • 移除了永久代(PermGen),替换为元空间(Metaspace)
  • 永久代中的class metadata(类元信息)转移到了native memory(本地内存,而不是虚拟机)
  • 永久代中的interned Strings(字符串常量池) 和 class static variables(类静态变量)转移到了Java heap
  • 永久代参数(PermSize MaxPermSize)-> 元空间参数(MetaspaceSize MaxMetaspaceSize)

Java8为什么要将永久代替换成Metaspace?

  • 字符串存在永久代中,容易出现性能问题和内存溢出。
  • 类及方法的信息等比较难确定其大小,因此对于永久代的大小指定比较困难,太小容易出现永久代溢出,太 大则容易导致老年代溢出。
  • 永久代会为 GC 带来不必要的复杂度,并且回收效率偏低。

标签:Java,虚拟机,永久,内存,JVM,Java8,初始
来源: https://www.cnblogs.com/wuzhixuan/p/16256215.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有