Java堆介绍

对于Java应用程序来说,Java堆(Java Heap)是虚拟机所管理的内存中最大的一块。Java堆是被所 有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,Java 世界里“几乎”所有的对象实例都在这里分配内存。在《Java虚拟机规范》中对Java堆的描述是:“所有 的对象实例以及数组都应当在堆上分配[1]”,而这里笔者写的“几乎”是指从实现角度来看,随着Java语 言的发展,现在已经能看到些许迹象表明日后可能出现值类型的支持,即使只考虑现在,由于即时编 译技术的进步,尤其是逃逸分析技术的日渐强大,栈上分配、标量替换[2]优化手段已经导致一些微妙 的变化悄然发生,所以说Java对象实例都分配在堆上也渐渐变得不是那么绝对了。
Java堆是垃圾收集器管理的内存区域,因此一些资料中它也被称作“GC堆”(Garbage Collected Heap,幸好国内没翻译成“垃圾堆”)。从回收内存的角度看,由于现代垃圾收集器大部分都是基于分 代收集理论设计的,所以Java堆中经常会出现“新生代”“老年代”“永久代”“Eden空间”“From Survivor空 间”“To Survivor空间”等名词,这些概念在本书后续章节中还会反复登场亮相,在这里笔者想先说明的 是这些区域划分仅仅是一部分垃圾收集器的共同特性或者说设计风格而已,而非某个Java虚拟机具体 实现的固有内存布局,更不是《Java虚拟机规范》里对Java堆的进一步细致划分。不少资料上经常写着 类似于“Java虚拟机的堆内存分为新生代、老年代、永久代、Eden、Survivor……”这样的内容。在十年 之前(以G1收集器的出现为分界),作为业界绝对主流的HotSpot虚拟机,它内部的垃圾收集器全部 都基于“经典分代”[3]来设计,需要新生代、老年代收集器搭配才能工作,在这种背景下,上述说法还 算是不会产生太大歧义。但是到了今天,垃圾收集器技术与十年前已不可同日而语,HotSpot里面也出 现了不采用分代设计的新垃圾收集器,再按照上面的提法就有很多需要商榷的地方了。
如果从分配内存的角度看,所有线程共享的Java堆中可以划分出多个线程私有的分配缓冲区 (Thread Local Allocation Buffer,TLAB),以提升对象分配时的效率。不过无论从什么角度,无论如 何划分,都不会改变Java堆中存储内容的共性,无论是哪个区域,存储的都只能是对象的实例,将Java 堆细分的目的只是为了更好地回收内存,或者更快地分配内存。在本章中,我们仅仅针对内存区域的 作用进行讨论,Java堆中的上述各个区域的分配、回收等细节将会是下一章的主题。
根据《Java虚拟机规范》的规定,Java堆可以处于物理上不连续的内存空间中,但在逻辑上它应该 被视为连续的,这点就像我们用磁盘空间去存储文件一样,并不要求每个文件都连续存放。但对于大 对象(典型的如数组对象),多数虚拟机实现出于实现简单、存储高效的考虑,很可能会要求连续的 内存空间。
Java堆既可以被实现成固定大小的,也可以是可扩展的,不过当前主流的Java虚拟机都是按照可扩 展来实现的(通过参数-Xmx和-Xms设定)。如果在Java堆中没有内存完成实例分配,并且堆也无法再 扩展时,Java虚拟机将会抛出OutOfMemoryError异常。
[1] 《Java虚拟机规范》中的原文:The heap is the runtime data area from which memory for all class instances and arrays is allocated。 [2] 逃逸分析与标量替换的相关内容,请参见第11章的相关内容。 [3] 指新生代(其中又包含一个Eden和两个Survivor)、老年代这种划分,源自UC Berkeley在20世纪80
年代中期开发的Berkeley Smalltalk。历史上有多款虚拟机采用了这种设计,包括HotSpot和它的前身Self 和Strongtalk虚拟机(见第1章),原始论文是:https://dl.acm.org/citation.cfm?id=808261。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/576401.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

推荐算法工程师的成长之道

推荐算法工程师的成长之道 原创: gongyouliu 大数据与人工智能 3月20日 源链接:原文地址 本文,作者会基于自己的实践经验讲述推荐算法工程师的成长之道,这里的“道”有发展路径和道(道理、方法论、经验、智慧)两层意思。 所以本文…

java电子商务源码解读 b2b2c o2o

大型企业分布式互联网电子商务平台,推出PC微信APP云服务的云商平台系统,其中包括B2B、B2C、C2C、O2O、新零售、直播电商等子平台。 分布式、微服务、云架构电子商务平台 java b2b2c o2o 技术解决方案 开发语言: java、j2ee 数据库&#x…

jQuery上传插件-uploadify3.1使用说明

uploadify ,简单实用的flash上传组件,兼容性良好。 现已有html5版本。 官方地址:http://www.uploadify.com/ 官方英文文档:http://www.uploadify.com/documentation/ Demos Download 使用方法(.net版本): 前台JS $("#id&q…

《关键对话——掌握关键对话》读书笔记(二)

《关键对话——掌握关键对话》读书笔记(二) 上一节中我们已经定义了关键对话,在面对关键对话时(比如老板给你安排了一项非常不合适的任务),你的选择可能只有如下两种: 1.当面表示反对,把老板惹怒 2.沉默接…

信息流推荐多样性

信息流推荐多样性 一、问题现状 信息流产品中一个常见的问题是多样性越来越差,造成这种问题的原因在于机器学习算法本身。下面通过一副系统循环图来介绍多样性差的问题。 资讯库随机推荐文章,由于是按照全库比例采样,娱乐占比较大&#xf…

Robocode教程2——你的第一个robo,取个好名字哦

摘自:http://site.douban.com/widget/notes/7736245/note/210029011/ 你需要准备的东西:1.c语言的知识和一点点的java知识,robocode意在学习java,不要要太深的java水平,你只要理解java和c的区别就可以了。2.robocode A…

《关键对话——从“心”开始,如何确定目标》读书笔记(三)

从“心”开始,如何确定目标、 我们的问题并不是行为本身是错误的,而是我们的动机有问题,即我们常常弄错要面对的目标。 一、从心开始 对话高手总是能做到从心开始。在开展高风险对话时,他们总是首先明确目的和动机,无…

UI设计师的面试过程

Palantir Technologies是一家提供分析、整合、可视化各种数据的IT型技术公司。在该公司,前端工程师和后端工程师有同样的面试过程,前端工程师也需要的一定的编程基础。该公司技术博客Palantir TeckBlog日前发表了一篇博文《The UI Design Interview》&am…

C语言代码实现数组(简单)

前一节课讲了数组的删除功能实现&#xff1a;删除功能 本节课内容我们实现数组的反转功能和冒泡排序功能&#xff1a; #include <stdio.h> #include <string.h> #include <malloc.h> #include <stdlib.h>struct Arr{int * pBase; //存储数组第一个元…

数据在市场运营中的应用

数据在市场运营中的应用 1. 背景 目前的产品运营、用户拉新、渠道投放、留存等都是靠人工进行策略制定&#xff0c;有的公司和部门完全靠着以前的经验在尝试互联网产品的市场营销和运营。这样不仅效率很低&#xff0c;而且效果也不显著。 主要存在的问题有以下几点&#xff…

C语言的typedef用法

案例1&#xff1a; #include <stdio.h> #include <string.h> #include <malloc.h>typedef int zhangsan; //为int在多取一个名字 zhangsan等价于intstruct Student{int sid;char sname[100];char sex;} ST;int main() {int i 10; //等价于zhangsan i10…

信息流项目计划和思路

目录 一、对项目的认识. 4 1&#xff0e;用户需求和竞品. 4 2. 项目现状. 4 3. 发展前景. 4 二、项目的业务方向和思路. 6 1. 业务方向. 6 2. 2020年目标. 6 3. 思路. 6 3.1用户留存提升&#xff08;6%->12%&#xff09;. 6 3.2日活提升&#xff08;30万->80万…

MySQL学习笔记_关于MySQL的字符类型VARCHAR长度知识总结

MySQL学习笔记_关于MySQL的字符类型VARCHAR长度知识总结 一.VARCHAR存储和行长度限制 1.VARCHAR(N)中&#xff0c;N指的是字符的长度,VARCHAR类型最大支持65535,指的是65535个字节,但并不支持65535长度的varchar&#xff0c;65535中应该包含了所有字段的长度、变长字段长度标示…

数据结构链表知识入门

链表定义: n个节点离散分配&#xff0c; 彼此通过指针相连 每个节点只有一个前驱节点&#xff0c;每个节点只有一个后续节点 首节点没有前驱节点尾节点没有后续节点 专业术语: 首节点:第一个有效节点尾节点:最后一个有效节点头结点: 1&#xff0c;第一个有效节点之前的那个节…

《关键对话——注意观察,如何判断对话氛围是否安全》读书笔记(四)

《关键对话——注意观察&#xff0c;如何判断对话氛围是否安全》读书笔记(四) 在对话过程中&#xff0c;既要关注对话内容&#xff08;即讨论的主题&#xff09;&#xff0c;也要观察对话气氛&#xff08;即参与者的反应&#xff09;。越早意识到你和对方退出了对话机制&#x…

扬长避短使用Windbg和Visual Studio高效调试调试你的代码

扬长避短使用Windbg和Visual Studio高效调试调试你的代码 经常被问及这样的问题&#xff1a; 你为什么非要使用Windbg调试你的程序&#xff1f; 记得有一次面试的时候笔者也被问到这样的问题&#xff0c;我的回答是&#xff1a;不是我非要使用Windbg, 只是在不同的情况下使用不…

链表的分类

分类: 单链表 双链表:每一个节点有两个指针域 循环链表&#xff1a;能通过任何一个节点找到其他所有的结点 非循环链表 链表中第一个结点的存储位置叫做头指针&#xff0c;那么整个链表的存取就必须是从头指针开始进行了。之后的每一个结点&#xff0c;其实就是上一个的后继指…

机器学习基础笔记总结

最近在学习latex&#xff0c;将之前的机器学习基础知识相关的笔记用latex整理了以下&#xff0c;源地址如下&#xff1a; https://github.com/duankai/latex_book&#xff0c;感兴趣的可以自由下载&#xff0c;也可以随意使用latex的格式。 pdf 效果如下&#xff0c;文件可在h…

IOS基础:ActionSheet(上拉菜单)的实现

一看图就明白了&#xff0c;毋需多说。 [java] view plaincopyprint?UIActionSheet* mySheet [[UIActionSheet alloc] initWithTitle:"ActionChoose" delegate:self cance…