iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java虚拟机内存管理知识有哪些
  • 116
分享到

Java虚拟机内存管理知识有哪些

2023-06-04 09:06:07 116人浏览 独家记忆
摘要

这篇文章主要讲解了“Java虚拟机内存管理知识有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java虚拟机内存管理知识有哪些”吧!0、Java 对内存的划分:Java虚拟机规范将物理内

这篇文章主要讲解了“Java虚拟机内存管理知识有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java虚拟机内存管理知识有哪些”吧!

0、Java 对内存的划分:

Java虚拟机内存管理知识有哪些

Java虚拟机规范将物理内存(主内存和CPU中的缓存、寄存器)划分为 程序计数器 、 Java 虚拟机栈 、 本地方法栈 、 Java 堆 、 方法区 五个区域,但并没有规定这些区域的具体实现,在其他地方听到的一些名词(如永久代、元空间等,这些都是方法区的具体实现)可能都是这些区域具体的实现,这点要特别注意,别被这些概念搞晕。

各个区域的特点如下表:

区域线程关系内存异常垃圾回收作用
程序计数器线程私有记录Java虚拟机正在指向的字节码指令
Java 虚拟机栈线程私有StackOverflowError、OutOfMemoryError描述 Java 方法执行时的内存模型,栈中栈帧存储局部变量表、操作数栈、动态链接、方法返回地址等信息。
本地方法栈线程私有StackOverflowError、OutOfMemoryError描述本地方法(非 Java 代码编写)执行时的内存模型
方法区线程共享OutOfMemoryError存储虚拟机加载过的类信息、常量(常量池)、静态变量、即时编译器(JIT)生成的代码
Java 堆线程共享OutOfMemoryError存放 Java对象(实例)
1、类加载器:

类加载器分为 Bootstrap 、 Extension ClassLoader (Java9 中是 PlatfORM ClassLoader)、 Application ClassLoader ,级别也是从低到高。

可以调用类加载器对象的 getParent() 方法查找该级加载器的上一级加载器,也成为父类加载器。

类加载器描述是否为 Java 实现
BootstrapJVM启动时创建,通常由操作系统相关的本地代码实现,是最根基的类加载器,负责装载的是最核心的 Java 类,如 Object 类、System 类、String 类等
Extension ClassLoader加载一些扩展的系统类,如 XML、加密、压缩相关功能的类
Application ClassLoader加载用户定义的 CLASSPATH 路径下的类

此处不翻译了,翻译后就变味了,尤其是下面的 Parents Delegation Model 翻译为双亲委派模型很不恰当。

字节码文件加载到内存中,才可以实例化出类,而类加载器就是负责加载 Java 类的。低级别的类加载器在加载一个类时会先询问上一级的类加载器,直到询问到顶级的类加载器(Bootstrap),如果顶级的类加载器可以加载就加载该类,否则向下尝试是否可以加载该类,也即是如果上一级类加载器能加载的就用上一级加载(复用上一级的类加载器),用不了再用自身的类加载器加载,这也就是口口相传却是翻译很不恰当的双亲委派模型。这样做可以使类加载更加安全,避免加载和标准 Java 类同包同名的类破坏虚拟机。

Java虚拟机内存管理知识有哪些

可以根据需要继承 Application ClassLoader 实现自定义类加载器,隔离加载器、修改类的加载方式、扩展加载源、防止源码泄露。

2、类加载的过程:

类加载是将字节码文件实例化成 Class 对象并进行相关初始化的过程。类加载包括类的 加载(Load)、类的 链接 (Link)、类的 初始化 (init)三个步骤。

类的加载是将字节码文件以二进制流的方式读取到内存中并转化为特定的数据结构,检查 cafe baby 这个魔法数(是不是Java文件的标志),是否有父类等,创建类对应的 Class 对象。

类的链接又分为 验证 、 准备 、 解析 三个阶段,验证阶段是进行更加详细的校验,如类型是否正确,静态变量是否合理等;准备阶段是为类的静态变量分配内存空间,并设定默认值;解析阶段是保证类和类之间相互引用的正确性,完成类在内存中的结构布局。

类的初始化并不是初始化对象,而是根据代码中的值初始化类的静态变量值,类的静态变量的初始化方式也有直接在声明时指定值和在静态代码块中指定值两种方式。

3、访问对象的两种方式:

Java虚拟机栈中的局部变量表存放的数据除了基本的数据类型外,还有对象的引用类型(reference),这关系到如何访问一个对象。

在不同的虚拟机中,对象的访问方式也是不同的,主流的访问方式有 使用句柄 和 直接指针 两种。

  • 使用句柄:

Java虚拟机内存管理知识有哪些

使用句柄是在 Java 堆中划分出一块区域作为句柄池,句柄池中存放对象的实例数据和类型数据(类相关的信息),reference 中存放的是对象在句柄中的地址,这是一种间接访问对象方式。

  • 直接指针:

Java虚拟机内存管理知识有哪些

直接指针是reference中直接存放对象的地址,但 Java 堆需要考虑如何存放访问对象类型的指针。

两种方式其实各有优劣,如下表:

方式优势特点
使用句柄reference 中存放的是稳定的句柄地址,对象在移动时只改变句柄池中对象的地址,而reference中的地址不需要改变。间接访问
直接指针节省了一次指针定位的时间开销,访问速度相对更快。直接访问
4、判断对象是否可以回收的算法

垃圾回收之前需要判断对象是否可以回收,常见的判断算法有引用计数算法和可达性分析算法。

引用计数算法:

每个对象都有对应的引用计数器,当有一个地方引用该对象时,就将引用计数器的值加1,当引用失效时,就将引用计数器的值减1,当计数器的值为0时,表示对象没有引用,可以被回收了。

缺点:看起来简单高效,但是有循环引用问题。如果两个对象中包含对方的引用就会产生循环引用问题,导致垃圾收集器不能回收对象。

可达性分析算法:

如果对象与GC Roots 之间没有直接或间接的应用关系,就可以被回收了。常见的 GC Roots 对象包括虚拟机栈(栈帧本地变量表)中引用的对象、方法区中静态属性引用的对象、方法区常量引用的对象、本地方法栈中(Native 方法)引用的对象。GC Roots,是一个特殊的对象,且绝对不能被其他对象引用,不然也会像引用计数算法那样有循环引用的问题。

注:欢迎工作1到6年的Java工程师朋友们加入Java架构交流裙:834962734。群内提供免费的Java架构学习资料(有springmybatisNetty源码分析高并发、高性能、分布式微服务架构的原理,JVM性能优化等...)这些成为架构师必备的知识体系,以及Java进阶学习路线图。

5、常见的垃圾回收算法:
  • 标记-清除算法

最基本的垃圾回收算法,后续的算法都是对它的改进。

首先标记出需要回收的对象,再将标记出的区域内容清除。

缺点是:标记时的查找效率,清除时产生内存碎片。

Java虚拟机内存管理知识有哪些

  • 标记-复制算法

将内存区域划分为两块,每次只使用一块,垃圾回收时,标记正在使用的内存区域,将存活的对象复制到另一块内存区域,再将原来的那一块内存区域一次性清除。避免了内存碎片的产生,但不适合存活时间长的对象。

缺点:浪费了一半的内存空间,当对象存活率高时,进行大量的复制操作,效率不高。

Java虚拟机内存管理知识有哪些

  • 标记-整理算法

标记过程和标记-除算法相同,垃圾回收时,是将存活的对象向同一端移动,再清除这之外的内存区域,这样就使得对象占用的内存区域连续,避免了内存碎片的产生。

Java虚拟机内存管理知识有哪些

  • 分代收集算法

根据对象存活时间的长短,将堆内存分为新生代和老生代,存活时间短的对象放在新生代区域,存活时间长的大对象(如对象数组)放在老生代区域。新生代和老生代的比例是 1 : 2,新生代又分为一个 Eden 区和两个 Survivor 区。新生代使用标记-复制算法,老生代使用标记-清除算法或标记-整理算法,这样最大发挥各自算法的优势。

Java虚拟机内存管理知识有哪些

6、常见的垃圾回收器:
  • Serial 回收器

Serial 采取 “复制算法” 实现,如果是在单 CPU 环境下,Serial 收集器没有线程交互的开销,理论上是可以获得最高的单线程执行效率,STW 的时间也可以控制在几十到几百毫秒内,这个时间是完全可以接受的。

  • Serial Old (PS MarkSweep)回收器

Serial Old 收集器 是 Serial 收集器的老年代版本,同样也是一个单线程收集器,使用了 “标记-整理算法”。

  • ParNew 回收器

ParNew 收集器实际上就是 Serial 收集器的多线程版本,收集算法、STW、对象分配的规则、回收策略等都与 Serial 收集器完全一样,两者相同的代码很多。ParNew 收集器虽然有多线程优势,但在单 CPU 和多 CPU 环境下,效果并不一定会比 Serial 好,至少在单 CPU 环境下是肯定不如的 Serial 的。

  • Parallel Scavenge 回收器

Parallel Scavenge收集器和 ParNew 收集器很像,也是一个新生代收集器,也是使用复制算法,并且还是并行的多线程的收集器。相比于 ParNew 收集器,Parallel Scavenge收集器可以更加精准的控制 CPU 的吞吐量和 STW 的时间,对于交互不多的任务可以更快地完成。

  • Parallel Old 回收器

Parallel Old 收集器是 Parallel Scavenge 收集器的老年代版本,使用多线程和 “标记-整理算法”。在 Parallel Old 收集器出现之间,选择了 Parallel Scavenge 收集器作为新生代的收集器,就只能选择 Serial Old 收集器作为老生代收集器,这样肯定就是对多 CPU 的浪费,所以 Parallel Scavenge收集器 + Parallel Old 收集器,对于多 CPU 环境吞吐量要求高的环境,算是强强联合。

  • CMS 回收器

CMS (Concurrent Mark Sweep)收集器从英文名字上看就是基于 “标记-清除算法” 实现的,并且还有并发的特点,它是一种以缩短 STW 的时间为目标的收集器,对于一些重视服务响应速度的网站,肯定是 STW 越短,用户体验越好,但是缺点是会在垃圾收集结束后产生大量的空间碎片。

通过初始标记(Initial Mark)、并发标记(Concurrent Mark)、重新标记(Remark)、并发清除(Concurrent Sweep)四个步骤完成垃圾回收。

  • G1 回收器

G1 收集器是目前最先进的收集器,也是 jdk7 之后默认的垃圾回收器,它是基于 “标记-复制算法” 实现的,所以不会产生内存碎片,并且也可以精准地控制 STW 的时间。G1 收集器对于新生代和老年代都是适用的,优先回收垃圾最多的区域。

感谢各位的阅读,以上就是“Java虚拟机内存管理知识有哪些”的内容了,经过本文的学习后,相信大家对Java虚拟机内存管理知识有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: Java虚拟机内存管理知识有哪些

本文链接: https://www.lsjlt.com/news/237081.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java虚拟机内存管理知识有哪些
    这篇文章主要讲解了“Java虚拟机内存管理知识有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java虚拟机内存管理知识有哪些”吧!0、Java 对内存的划分:Java虚拟机规范将物理内...
    99+
    2023-06-04
  • C++内存管理的知识点有哪些
    这篇文章主要讲解了“C++内存管理的知识点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++内存管理的知识点有哪些”吧!1. 简述下C++的内存分配方式。在C++中,内存可以分为 5...
    99+
    2023-07-05
  • Linux内存管理的知识点有哪些
    这篇文章主要介绍“Linux内存管理的知识点有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Linux内存管理的知识点有哪些”文章能帮助大家解决问题。1 前言内存管理是Linux内核中非常重要的...
    99+
    2023-06-16
  • JVM虚拟机内存模型与高效并发知识点有哪些
    这篇文章主要讲解了“JVM虚拟机内存模型与高效并发知识点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JVM虚拟机内存模型与高效并发知识点有哪些”吧!Java内存模型,即Java Me...
    99+
    2023-06-02
  • 虚拟主机基础知识点有哪些
    今天小编给大家分享一下虚拟主机基础知识点有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。什么叫虚拟主机?  虚拟主机,是...
    99+
    2023-06-12
  • Java虚拟机内存管理该怎么理解
    今天就跟大家聊聊有关Java虚拟机内存管理该怎么理解,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java虚拟机规范将物理内存(主内存和CPU中的缓存、寄存器)划分为程序计数器、Ja...
    99+
    2023-06-02
  • Java内存模型的知识点有哪些
    这篇文章主要介绍“Java内存模型的知识点有哪些”,在日常操作中,相信很多人在Java内存模型的知识点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java内存模型的知识点有哪些”的疑惑有所帮助!接下来...
    99+
    2023-06-16
  • Java虚拟机中内存的运行区域有哪些
    这期内容当中小编将会给大家带来有关Java虚拟机中内存的运行区域有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。详解Java虚拟机管理的内存运行时数据区域概述    Ja...
    99+
    2023-05-31
    java 虚拟机 内存
  • 虚拟主机管理系统有哪些
    常见的虚拟主机管理系统有:1.Cpanel控制面板,功能强大,管理简捷;2.网站管理助手,适用于缺乏管理技术的站长;3.Plesk控制面板,WEB服务器管理软件;4.Ensim控制面板,高端的应用软件;5.DirectAdmin控制面板,网...
    99+
    2024-04-02
  • vue中的虚拟dom知识点有哪些
    本文小编为大家详细介绍“vue中的虚拟dom知识点有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue中的虚拟dom知识点有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、简介虚拟dom是随着时代发...
    99+
    2023-06-30
  • Linux系统内存知识点有哪些
    这篇文章主要介绍Linux系统内存知识点有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、走进 linux 内存1、内存是什么?1)内存又称主存,是 CPU 能直接寻址的存储空间,由半导体器件制成2)内存的特点...
    99+
    2023-06-15
  • 有哪些数据库内存知识点
    本篇内容介绍了“有哪些数据库内存知识点”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、如何看懂内存指标遇...
    99+
    2024-04-02
  • 虚拟主机内存空间怎么管理
    虚拟主机内存空间的管理可以通过以下几个方面来实现:1. 分配内存空间:虚拟主机可以通过内存分配算法,将可用的内存空间分配给不同的虚拟...
    99+
    2023-09-12
    虚拟主机
  • 大内存虚拟主机租用有哪些好处
    大内存虚拟主机租用有以下几个好处:1. 提供更高的性能:大内存虚拟主机可以为网站或应用程序提供更大的内存空间,使其能够更好地处理大量...
    99+
    2023-08-22
    虚拟主机
  • linux虚拟主机管理的方法有哪些
    Linux虚拟主机管理的方法有多种,以下是其中几种:1. 控制面板:许多虚拟主机提供商都会提供控制面板,使得用户可以方便地管理虚拟主...
    99+
    2023-05-17
    linux虚拟主机管理 虚拟主机
  • 虚拟主机系统管理软件有哪些
    虚拟主机系统管理软件有:1、N点虚拟主机管理系统,功能齐全,能在线压缩及解压文件、自定错误信息、域名解析、自定MIME种类等;2、E...
    99+
    2023-02-10
    虚拟主机系统 虚拟主机
  • Java反射机制知识有哪些
    本篇内容主要讲解“Java反射机制知识有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java反射机制知识有哪些”吧!一、什么是class类在面向对象的世界里,万物皆对象。类是对象,类是ja...
    99+
    2023-06-17
  • Oracle内存和架构知识点有哪些
    本篇内容介绍了“Oracle内存和架构知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Oracl...
    99+
    2024-04-02
  • .NET内存分配的知识点有哪些
    这篇文章主要讲解了“.NET内存分配的知识点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“.NET内存分配的知识点有哪些”吧!在分析内存分配时,应该先了解关于堆栈的区别堆的分配向高地址...
    99+
    2023-06-17
  • Docker管理的碎片知识有哪些
    本篇内容主要讲解“Docker管理的碎片知识有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Docker管理的碎片知识有哪些”吧!一、概述本文旨在汇总整理Docker日常管理的知识碎片。二、...
    99+
    2023-06-21
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作