我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java虚拟机的Heap怎么理解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java虚拟机的Heap怎么理解

本篇内容介绍了“Java虚拟机的Heap怎么理解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

在Java虚拟机中,我是一个位高权重的大管家,他们都很怕我,尤其是那些Java 对象,我把他们圈到一个叫做Heap的“监狱”里,严格管理,生杀大权尽在掌握。

中国人把Stack翻译成“栈”,把Heap翻译成“堆”, 还有人会把Stack翻译成“堆栈”,唉,真不知道他们是怎么想的, 不过这么多年都过来了,你们明白就好。

碰巧我会对Heap中的Java 对象做垃圾回收,这个“堆”总是让我联想到垃圾堆。

说起垃圾回收,这实在是一个大负担,原因很简单,那些写Java程序的人类只管把对象给new出来,扔到Heap 中, 但是从来不管把他delete 掉, 删掉这些对象的责任就落到了我的头上,我不严格管理怎么行?

有时候我挺羡慕C和C++, 必须得手动地分配和释放内存,出了错都是程序员来背锅。

在我这里,如果任由这些对象肆意妄为,我那容量不高的,Java虚拟机启动后就无法更改的Heap“监狱”很快就会被填满, 所以我必须得派出我的得力助手,专门找到并且清理那些不用的Java 对象, 把他们占据的空间给释放掉。

为了找到这些捣乱分子,我发明了一个叫做“可达性分析”的算法,这个算法估计大部分人已经知道了,我就不再啰嗦了,下面这张图说明了背后的思想,聪明的你一眼就能看出来, 橙色的对象都是不可达对象,可以回收。

Java虚拟机的Heap怎么理解

1、Heap监狱

好吧,现在详细说一下我管理的Heap“监狱”。

你可以把它想象成一大片空间,为了方便管理, 我把Heap“监狱”划分成多个区域,然后把那些Java对象在其中搬来搬去。

Java虚拟机的Heap怎么理解

我定的规矩就是: 新来的家伙们都要进入新生代待着,新生代住不下了,我就派出清理者进行垃圾回收(Minor GC),回收以后还住不下,那就把年龄大的老家伙们赶到养老院(老年代)去。

每个在Heap中的Java对象我都会设置一个年龄计数器,每次Java对象熬过一次GC,就把年龄加1, 如果老到一定程度,对不起,请进入养老院(老年代)。  实际上我还会做动态的年龄判断,这里按下不表。

你可能会觉得奇怪,为什么在新生代里分出了Eden, Survivor1, Survivor2这样奇怪的区域?

那是因为我想在这里实现一个所谓的“复制”算法。

最早的时候, 我是把一个内存的区域划分成大小相当的两个区域,每次只用其中的一个。

Java虚拟机的Heap怎么理解

区域1用完了,我就做垃圾回收,把存活的都搬到另外一个区域。

注意:搬过去以后,他们都会紧紧地挨在一起居住,这样以来,被清理掉的那些红色碎片就会重新平整成一大块空间,方便后续使用,尤其是针对大块头对象来了以后。

这么来回颠倒着使用两个区域,虽然效率高,没有碎片,但是浪费的空间很巨大:每次只能用一半。

后来人类发现,大部分在新生代的对象都活不了多长时间,基本上一次垃圾回收就删除得差不多了。

所以就改进了这个只用一半的复制算法, 把新生代分成三个部分:Eden , Survivor1, Survivor2 , 他们的比例是8:1:1。

每次只使用Eden 和其中一个Survivor , 当垃圾回收时,把这两块区域中还活着的对象复制到另外一个Survivor, 如果Survivor放不下,请进养老院(老年代)吧。

如果很不幸, 连养老院都住满了,那只好搞一次Full GC了,这是个很慢的操作,你们最好祈祷它不要频繁发生。

2、“监狱”之外,大有可为

虽然我可以在Heap监狱内作威作福,有时候我也得接触下监狱之外的世界。

有一次要通过Socket向外发送数据,我明明把数据准备好了,就在我的Heap中,可是JVM老大竟然把数据复制了一份到Heap之外的内存中去,然后才能通过Socket发送。

我问他这到底是怎么回事,为什么要多此一举,难道是对我这个Heap监狱的大管家不放心?

JVM老大说确实是不放心,人家底层的Socket都是C语言写的, 关注的是物理内存的地址, 你垃圾回收的时候把Java对象在什么Eden, Survivor, 老年代之间挪来挪去,对象的地址也会变来变去, 我怎么告诉人家到底发哪个地址的数据啊?

想想也是这个理儿,有得必有失,你程序员不用管理内存,但是底层还得和内存打交道,并且还额外多了一道工序:Copy 。

老大还说:“可能你还不知道,除了你的Heap监狱,其实我在Java进程中还有一块儿叫做“Off-Heap内存’的地方,数据就会复制到这里。 为了和你区分开,我把它叫做堆外内存。”

Java虚拟机的Heap怎么理解

没想到这里还有一块我都管不着的“飞地”!

不过它和我也没有什么竞争关系,由它去吧。

可是没过几天,JVM老大再次给我带来了“惊喜”。

他说:“复制数据太麻烦了,我想了个办法,可以在Java代码中直接分配一块属于Off-Heap的内存。”

我觉得头皮发蒙:“直接在堆外内存分配?到底怎么分配?”

老大给了我一段代码:“看看,这不就分配了128M的堆外存吗? 对这个buffer的读写操作会直接写入堆外内存, 不用再经过你来复制了。”

ByteBuffer buffer = ByteBuffer.allocateDirect(1024*1024*128);

skycto JEEditor:一键生成功能代码,直接面向接口编程

该死的面向接口编程,这个ByteBuffer分配出来的堆外内存,就像一个普通的Java对象在使用,丝毫看不出它在堆内还是在堆外。

完了,这块内存我是彻底管不了了。

老大看出我情绪不对,安慰道: “这个buffer也是个Java对象啊, 就在你的Heap中存着,只不过它保存了那128M内存的信息而已。”

Java虚拟机的Heap怎么理解

这还差不多 ! 既然它是个Java对象,那就得放到我的Heap监狱中,被我控制!

可以想象,这个对象被垃圾回收的时候, 它指向的直接内存才会被释放。

我突然有了一个邪恶的想法:如果这样的对象越来越多,并且一直不被垃圾回收,那对应的直接内存岂不也是不能释放,然后Out of Memory ?

老大似乎看穿了我的思想:“对于这些对象,得特别小心,一定得确保能释放。”

直接分配堆外内存的功能正式推出了,我发现分配起堆外内存要比堆内内存要慢一点,心想估计没有多少人使用吧。 可没想到的是它特别适合那些分配次数少,读写操作很频繁的场景。于是就受到了Netty这些通信类系统的热烈欢迎。

为了减少创建堆外内存的开销,Netty 还引入了对象池的技术,就像数据库连接池一样,先分配一些堆外内存, 然后不断地复用他们。

我没想到堆外内存能玩出这么多的花样,但是一想到他们还是Java程序,还得用Java对象包装,无论如何都跳不出我的手掌去,也就释然了。

“Java虚拟机的Heap怎么理解”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java虚拟机的Heap怎么理解

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

下载Word文档

猜你喜欢

Java虚拟机的Heap怎么理解

本篇内容介绍了“Java虚拟机的Heap怎么理解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在Java虚拟机中,我是一个位高权重的大管家,
2023-06-02

Java虚拟机内存管理该怎么理解

今天就跟大家聊聊有关Java虚拟机内存管理该怎么理解,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java虚拟机规范将物理内存(主内存和CPU中的缓存、寄存器)划分为程序计数器、Ja
2023-06-02

Java虚拟机中的双亲委派机制怎么理解

Java虚拟机中的双亲委派机制怎么理解,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类
2023-06-22

如何理解Java 虚拟机中HotSpot 虚拟机对象

今天就跟大家聊聊有关如何理解Java 虚拟机中HotSpot 虚拟机对象,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、对象的创建对象的创建步骤:1. 类加载检查虚拟机遇到一条 n
2023-06-05

Java是怎么运行起来的?深入理解Java虚拟机

了解JVM是如何支持Java语言和其他相关语言的,对于程序员来说是很有裨益的。本文分享一下Java的工作原理和JVM的内部结构。
Java虚拟机2024-11-30

Java虚拟机怎么用

这篇文章主要讲解了“Java虚拟机怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java虚拟机怎么用”吧!Java虚拟机Java虚拟机(JavaVirtualMachine)简称JVM
2023-06-17

怎么理解并掌握Java虚拟机内存区

本篇内容主要讲解“怎么理解并掌握Java虚拟机内存区”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解并掌握Java虚拟机内存区”吧!一、方法区(Method Area)方法区的概念方法区又
2023-06-16

如何理解JAVA虚拟主机

今天就跟大家聊聊有关如何理解JAVA虚拟主机,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。其实虚拟主机也可以称之为网站空间,就是把一台运行在互联网上的物理服务器,划分为多个虚拟服务器
2023-06-07

深入理解Java虚拟机:堆详解

内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的JVM对于内存的划分方式和管理机制存在着部分差

Java虚拟机OOM怎么用

本文小编为大家详细介绍“Java虚拟机OOM怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java虚拟机OOM怎么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。通过代码模拟Java虚拟机规范中描述的各个
2023-06-02

深入理解Java虚拟机:程序计数器与虚拟机栈详解

在Java​源文件被编译到字节码文件中时,所有的变量和方法引用都作为符号引用(Symbolic Reference​)保存在class文件的常量池里。

Linux的虚拟机怎么管理

Linux的虚拟机可以通过多种方式进行管理,以下是几种常见的方法:1. 命令行管理:使用命令行工具如virt-manager、virsh或qemu-kvm等直接在Linux终端中管理虚拟机。通过这些工具,可以创建、启动、停止、暂停、删除和监
2023-10-26

Java虚拟机是怎么工作的

这篇文章主要介绍“Java虚拟机是怎么工作的”,在日常操作中,相信很多人在Java虚拟机是怎么工作的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java虚拟机是怎么工作的”的疑惑有所帮助!接下来,请跟着小编
2023-06-03

虚拟主机怎么运行java

虚拟主机如何运行Java虚拟主机通过将服务器分割成虚拟专用服务器(VPS)来运行Java应用程序。每个VPS在Java虚拟机(JVM)中运行应用程序,负责将Java字节码翻译成机器代码。部署过程涉及选择提供商、创建VPS、安装Java、上传应用程序、配置服务器并启动应用程序。这种方法提供了隔离、可扩展性、成本效益和易于管理的优点。然而,它也存在资源限制、可靠性问题、安全威胁和自定义限制等局限性。适用于Java应用程序的虚拟主机提供商包括Bluehost、HostGator和DreamHost。
虚拟主机怎么运行java
2024-04-09

虚拟主机怎么运行java

要在虚拟主机上运行Java,您需要确保虚拟主机上安装了Java运行时环境(JRE)或Java开发工具包(JDK)。然后按照以下步骤进行操作:1. 登录到您的虚拟主机控制面板或通过SSH远程连接到虚拟主机。2. 确保您的Java应用程序已编译
2023-08-31

java虚拟主机怎么使用

使用Java虚拟主机(JVM)可以让您在共享服务器上运行Java应用程序。以下是使用Java虚拟主机的步骤:1. 选择一个可靠的虚拟主机提供商,并注册一个账户。您可能需要支付一定的费用才能使用Java虚拟主机服务。2. 登录您的虚拟主机控制
2023-05-17

java虚拟机的工作原理是什么

Java虚拟机工作原理Java虚拟机(JVM)通过以下步骤执行Java程序:加载字节码验证字节码准备字节码编译字节码(JIT编译)执行字节码关键组件包括:Java堆、元空间、栈、垃圾回收器和类加载器。JVM将内存划分为运行时数据区域,包括程序计数器、虚拟机栈、本地方法栈、堆和方法区。类加载涉及加载、验证、准备、解析和初始化步骤。垃圾回收自动管理内存,释放未使用的对象。JVM优化包括JIT编译、垃圾回收和类加载优化。
java虚拟机的工作原理是什么
2024-04-12

eclipse无法创建java虚拟机怎么解决

解决Eclipse无法创建Java虚拟机(JVM)问题检查Java版本是否兼容,尝试更新Eclipse,配置Eclipse中的JVM设置,检查环境变量是否正确配置,尝试不同的JVM。还可以更新显卡驱动程序,重新安装Eclipse,使用“-vm”参数指定JVM,或联系社区寻求支持。
eclipse无法创建java虚拟机怎么解决
2024-04-10

eclipse无法创建java虚拟机怎么解决

如果Eclipse无法创建Java虚拟机,可能是由于内存不足或配置错误造成的,以下是一些可能的解决方法:检查Eclipse配置:确保Eclipse的配置正确,尤其是配置的JRE路径和内存分配是否正确。增加内存:尝试增加Eclipse的内存分
eclipse无法创建java虚拟机怎么解决
2024-04-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录