Java堆

C# NX二次开发:两种过滤器设置方案的实战解析与场景适配 本文深入解析C# NX二次开发中的两种过滤器设置方案:AddFilterHandler回调与MaskTriple属性设置。通过实战案例对比其性能差异与适用场景,帮助开发者根据需求选择最优方案,提升NX插件开发效率与交互体验。特别针对BlockStyler集成场景提供专业建议,是NX二次开发者的实用指南。 阅读详情

6. 堆

1. 概述

➢ 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。

➢ Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间。

➢ 堆内存的大小是可以调节的。

➢《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。

➢ 所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(ThreadLocal Allocation Buffer, TLAB)。

➢ 默认堆空间大小:

​ 初始内存大小: 物理电脑内存大小/64

​ 最大内存大小: 物理电脑内存大小/4

2. 年轻代和老年代

存储在JVM中的Java对象可以被划分为两类:

➢ 一类是生命周期较短的瞬时对象,这类对象的创建和消亡都非常迅速

➢ 另外一类对象的生命周期却非常长,在某些极端的情况下还能够与JVM的生命周期保持一致。

Java堆区进一步细分的话, 可以划分为年轻代(YoungGen) 和老年代(OldGen)

其中年轻代又可以划分为Eden空间、Survivor0空间和Survivor1空间 (有时也叫做from区、to区)

image-20200526164827181

image-20200526170143629

image-20200526170221685

在这里需要注意,系统虽然默认是8:1:1,但是 JVM 默认情况下还有一个自适应比例, 我们要使用-XX:-UserAdaptiveSizePolicy 关闭这个自适应规则后,才会使 JVM 默认的8:1:1.(第二个-代表关闭;+ 代表使用)

3. 内存分配

为新对象分配内存是-一件 非常严谨和复杂的任务,JVM的设计者们不仅需要考虑内存如何分配、在哪里分配等问题,并且由于内存分配算法与内存回收算法密切相关,所以还需要考虑GC执行完内存回收后,是否会在内存空间中停生内存碎片。

  1. new的对象先放 Eden(伊甸园区) 。此区有大小限制。
  2. 当 Eden(伊甸园区) 的空间填满时,程序又需要创建对象,JVM的垃圾回收器将对 Eden(伊甸园区) 进行垃圾回收(Minor GC 回收机制), 将 Eden(伊甸园区) 中的不再被其他对象所引用的对象进行销毁。再加载新的对象放到 Eden(伊甸园区)

3.然后将 Eden(伊甸园区) 中的剩余对象移动到幸存者0区。

4.如果再次触发垃圾回收,此时上次幸存下来的放到幸存者0区的,如果没有回收,就会放到幸存者1区。

5.如果再次经历垃圾回收,此时会重新放回幸存者0区,接着再去幸存者1区。

6.啥时候能去老年代呢?可以设置次数。默认是15次。 当Survior区中的对象的 age 计数器 已经达到了15时,此时该对象就会 Promotion 晋升到 Old generation 老年代。

7.在养老区,相对悠闲。当养老区内存不足时,再次触发GC: Major GC,进行养老区的内存清理。

8.若养老区执行了Major GC之后发现依然无法进行对象的保存,就会产生0OM异常

●可以设置参数: -XX: MaxTenuringThreshold=进行设置。

总结:当出现 Eden(伊甸园区)满的时候,就会触发 Minor GC 回收机制(或者说YGC),会将 Eden(伊甸园区) 和 Survior区(幸存者区)一起回收。若 Survior区(幸存者区)满了之后,它不会自动触发Minor GC 回收机制,它只能由Eden(伊甸园区)满时被动触发.

4. 对象分配过程:TLAB(Thread Local Allocation Buffer),即线程本地分配缓存区

为什么要有TLAB?

  • 堆区是线程共享区域,任何线程都可以访问到堆区中的共享数据。由于对象实例的创建在JVM中非常频繁,因此在并发环境下从堆区中划分内存空间是线程不安全的,那么在并发情况下,为避免多个线程操作同一地址,需要使用加锁等机制,进而影响分配速度。
  • 从内存模型而不是垃圾收集的角度,我们对Eden区域继续进行划分,JVM为每个线程分配了一个私有缓存区域,它包含在Eden空间内。在多线程情况下进行分配内存时,使用TLAB可以避免一系列的非线程安全问题,同时还能够提升内存分配的吞吐量,因此我们可以将这种内存分配方式称之为快速分配策略。据我所知所有OpenJDK衍生出来的JVM都提供了TLAB的设计。例如阿里的jvm
  • 尽管不是所有的对象实例都能够在TLAB中成功分配内存,因为默认情况下,TLAB空间的内存非常小,仅占有整个Eden空间的1%,所以可能出现内存不足,对象在TLAB空间分配内存失败时,JVM就会尝试着通过使用加锁机制确保数据操作的原子性,从而直接在Eden空间中分配内存。但JVM确实是将TLAB作为内存分配的首选。
  • 在程序中, 开发人员可以通过选项“-XX:UseTLAB"设置是否开启TLAB空间。当然我们可以通过选项“-XX: TLABWasteTargetPercent"设置TLAB空间所占用Eden空间的百分比大小。

5. 堆空间常用参数

/**
 * 测试堆空间常用的jvm参数:
 * -XX:+PrintFlagsInitial : 查看所有的参数的默认初始值
 * -XX:+PrintFlagsFinal  :查看所有的参数的最终值(可能会存在修改,不再是初始值)
 *      具体查看某个参数的指令: jps:查看当前运行中的进程
 *                             jinfo -flag SurvivorRatio 进程id
 *
 * -Xms:初始堆空间内存 (默认为物理内存的1/64)
 * -Xmx:最大堆空间内存(默认为物理内存的1/4)
 * -Xmn:设置新生代的大小。(初始值及最大值)
 * -XX:NewRatio:配置新生代与老年代在堆结构的占比
 * -XX:SurvivorRatio:设置新生代中Eden和S0/S1空间的比例
 * -XX:MaxTenuringThreshold:设置新生代垃圾的最大年龄
 * -XX:+PrintGCDetails:输出详细的GC处理日志
 * 打印gc简要信息:① -XX:+PrintGC   ② -verbose:gc
 * -XX:HandlePromotionFailure:是否设置空间分配担保
 *
 * @author mxc
 * @create 2020  17:18
 */

6.Minor GC、 Major GC、 Full GC的区别

JVM在进行GC时,并非每次都对上面**三个内存(新生代、老年代;方法区)**区域一起回收的,大部分时候回收的都是指新生代。

针对HotSpot VM的实现,它里面的GC按照回收区域又分为两大种类型:一种是部分收集(Partial GC),一种是整堆收集(Full GC)

  • 部分收集:不是完整收集整个Java堆的垃圾收集。其中又分为:

    • ➢新生代收集(Minor GC / Young GC) :只是新生代(Eden,S0,S1)的垃圾收集

    • ➢老年代收集 (Major GC / Old GC) :只是老年代的垃圾收集。

      • 目前,只有CMS GC会有单独收集老年代的行为。

      • 注意,很多时候Major GC会和Full GC混淆使用,需要具体分辨是老年代回收还是整堆回收。

    • ➢混合收集 (Mixed GC):收集整个新生代以及部分老年代的垃圾收集。

      • 目前,只有G1 GC会有这种行为
  • 整堆收集(Full GC):收集整个java堆和方法区的垃圾收集。

7. 老年代回收机制

在发生MinorGC之前,虚拟机会检查老年代最大可用的连续空间是否大于新生代所有对象的总空间。

  • 如果大于,则此次Minor GC是安全的

  • 如果小于,则虚拟机会查看-XX: HandlePromotionFailure设置值是否允许担保失败。

    • ➢如果HandlePromotionFailure=true, 那么会继续检查老年代最大可用连续空间是否大于历次晋升到老年代的对象的平均大小。
    • 如果大于,则尝试进行一”次Minor GC,但这次Minor GC依然是有风险的;
    • 如果小于,则改为进行一次Full GC。
    • ➢如果HandlePromotionFailure=false, 则改为进行一次Full GC。

在JDK6 Update24之后(或者说JDK7),HandlePromotionFailure参 数不会再影响到虚拟机的空间分配担保策略,观察OpenJDK中的源码变化,虽然源码中还定义了HandlePromotionFailure参数,但是在代码中已经不会再使用它。

JDK6 Update24(或者说JDK7)之后的规则变为只要老年代的连续空间大于新生代对象总大小或者历次晋升的平均大小就会进行Minor GC,否则将进行Full GC。

Pintos project 1 实验报告(代码分享) 任务一 Alarm Clock 用到的相干目录有: pintos/src/devices time.h && time.c pintos/src/threads thread.h && thread.c 预期pass希望:暂无,安装pintos之后,第一次对threads进行make check操作,可以发现以alarm--开头的前六个文件,以及mlfqs-fair-2和mlfqs-fair-20文件,一开始就测试成功pass。但是为了避免对后期的修改有影响,这里还是要 阅读详情

相关推荐

模拟滤波器的基础知识和设计

使用Python实现多种模拟滤波器

faltas的博客 3530

[JAVA数据结构]堆

java数据结构,堆的介绍

weixin_67719939的博客 3112

一步步教你获取ADNI影像数据:从搜索到下载全流程解析

本文详细解析了从ADNI数据库获取阿尔茨海默病影像数据的全流程,包括账号注册、数据检索技巧、高效下载策略及常见问题解决方案。特别介绍了高级搜索的黄金组合和智能数据集管理方法,帮助研究者快速获取T1加权MRI、PET等多模态影像数据,提升科研效率。

weixin_29061465的博客 323

Java数据结构--堆

当一颗二叉树的每个节点都大于等于它的两个子字节时,它被称为堆有序。而堆是一组能够用堆有序的完全二叉树排序的元素,并在数组中按照层级储存总而言之堆具有一下性质:①堆逻辑上是一颗完全二叉树,但本质上确是数组②堆中的某个节点总是不大于或不小于其父节点的值其中最主要且需要我们掌握的就是增( offer ) 删( poll )查( peek )等方法。

m0_74808313的博客 3027

Python爬虫实战:全方位解析前程无忧(51job)职位详情爬取及反爬破解

平台规模:覆盖全国各行业、数百万条岗位信息。数据特点:职位描述详细,职位标签丰富。数据价值:支持招聘趋势分析、职业发展研究、薪资行情调研。推荐Python 3.10+,支持最新async特性与库兼容。

2201_76125261的博客 1486

1.5 RAG技术栈全景图:LangChain vs LlamaIndex深度对比,选错框架后悔3年,一文帮你选对

摘要:LangChain与LlamaIndex框架深度对比 本文全面对比了RAG领域两大主流框架LangChain和LlamaIndex。LangChain是通用AI应用框架,具有模块化设计和丰富生态;LlamaIndex专为RAG优化,提供开箱即用解决方案。功能对比显示,LangChain在文档加载和Agent支持方面更强,而LlamaIndex在检索策略、向量存储和多模态处理上表现更优。代码示例展示了二者实现RAG的不同方式:LangChain需要更多配置但灵活性高,LlamaIndex则提供更简洁的A

yonggeit的博客 3239

java 堆(优先级队列)详解

如果有一个关键码的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储 在一个一维数组中,并满足:Ki = K2i+2) i = 0,1,2…,则称为 小堆(或大堆)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。

baixian110的博客 2338

[AI] 嵌入模型选择:bge / text-embedding-3 / Jina Embeddings 对比与选型指南

摘要: 本文对比了BGE-M3、OpenAI和Jina三种主流嵌入模型在语言覆盖、性能、延迟、维度和成本等维度的差异。BGE-M3适合中文场景,本地部署成本低;OpenAI API多语能力强但依赖网络;Jina在多语表现突出但需关注商用许可。测试显示BGE-M3本地延迟3-6ms,OpenAI API延迟200-600ms。选型建议:隐私场景选BGE本地部署,多语低维护选OpenAI,高精度选Jina。部署时需注意批处理优化、向量库压缩和商用许可等问题,建议建立评测指标并监控关键指标。

每日出拳老爷子的博客 428

JVM--堆

45. JVM--堆 1. 堆的核心概述 一个进程对应一个JVM的实例,一个JVM实例中只有一个运行时数据区,里面只有一个方法区和堆,一个进程的多个线程共享方法区和堆,那就要考虑线程的安全问题。 每个线程各有一套程序计数器、本地方法栈、虚拟机栈。 1、一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。 2、Java堆区在JVM启动的时候即被创建,其空间大小也就确定了,堆是JVM管理的最大一块内存空间,并且堆内存的大小是可以调节的。 3、《Java虚拟机规范》规定..

weixin_43890079的博客 500

uniapp - H5人脸识别认证与活体检测功能(纯前端免费方案+微信sdk人脸识别)完整源码,微信公众号网页/h5端人脸识别功能人脸核身(微信方案提供后端spring boot+thinkphp源码

uniapp实现人脸认证,uniAPP h5手机拍照+人脸识别,免费人脸识别插件,前端人脸识别解决方案,uniapp H5人脸识别带前后摄像头,人脸识别在H5页面进行采集,微信公众号H5人脸核身,H5端人脸识别功能实现,免费h5人脸识别插件方案,微信公众号H5网页实现人脸识别,uniapp人脸监测,uniapp人脸生物监测,使用uniapp开发H5人脸采集功能/人脸识别功能,uniapp项目—h5端人脸采集功能实现,uniapp vue3人脸核身,H5活体检测认证,人脸认证张嘴摇摇头指引动作,人脸核身 微信

🏆 前端领域优质创作者 3809

使用Qt在FreeRTOS上构建MCU应用程序

如果我们想要在FreeRTOS上运行该应用程序,我们需要选择适用于我们处理器架构的交叉编译工具链,并将目标设备设置为我们的开发板。在该代码中,我们使用xTaskCreate()函数创建了一个名为“qt_task”的任务,并将其启动。首先,我们需要安装Qt for MCU开发环境。Qt for MCU是基于Qt 5开发的针对MCU的特殊版本,它可以生成最小体积的代码,从而适用于资源有限的嵌入式系统。如果我们想要在FreeRTOS上运行这个程序,我们需要将其包装在一个任务中,并在任务创建后启动Qt的事件循环。

ByteWhizX的博客 1815

【Java】—— 堆

在计算机科学中,堆(heap)是一种特殊的树状数据结构。用于存储和管理数据。堆通常用于实现优先队列。其中具有最高(或最低)优先级的元素始终位于堆的根部。

weixin_74882234的博客 1288

对接金蝶云星空调用即时库存信息查询API(附JAVA实现)

这篇文章教你如何对接金蝶API并且使用JAVA调用金蝶云星空的即时库存查询API

实用的博客 2608

Java——堆

九月在老家是收割水稻的月份,每次打完水稻,农民伯伯就会拿稻杆累成一堆。我觉得这个稻杆堆和数据结构堆外形有点相似哈。**堆是一棵完全二叉树,**但是这个完全二叉树要满足条件:其中任意一个结点要 >= 其左孩子结点和有孩子结点,这叫大根堆;其中任意一个结点要

m0_74100417的博客 1804

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

java中堆总结

堆heap」是一种满足特定条件的完全二叉树,主要可分为两种类型,如图8‑1所示。‧「小顶堆minheap」:任意节点的值≤其子节点的值。‧「大顶堆maxheap」:任意节点的值≥其子节点的值。堆通常用于实现优先队列,大顶堆相当于元素按从大到小的顺序出队的优先队列。从使用角度来看, 我们可以将“优先队列”和“堆”看作等价的数据结构。/*初始化堆*///初始化小顶堆//初始化大顶堆(使用lambda表达式修改Comparator即可)

2302_81054350的博客 1049

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

java中的堆

文章目录一、堆的分类二、详述Java堆中各个区域 一、堆的分类 Java 中的堆是 JVM 管理的最大的一块内存空间,主要用于存放Java类的实例对象,其被划分为两个不同的区域:新生代 ( Young )和老年代 ( Old ),其中新生代 ( Young ) 又被划分为:Eden、From Survivor和To Survivor三个区域,如下图所示:(下图中永久代不属于堆) 从JDK8开始,...

kjw888的博客 1216

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java堆和native堆

为什么引进非Java堆? 1 Java如果和外界通讯,把Java 堆中的内容传输到外界,则需要把Java堆复制到非Java堆,如果使用native堆,则避免了内容在Java堆和非Java堆之间的copy.

u012333307的专栏 6532

Java堆和Native堆

为什么引进非Java堆? Java如果和外界通讯,把Java 堆中的内容传输到外界,则需要把Java堆复制到非Java堆,如果使用native堆,则避免了内容在Java堆和非Java堆之间的copy. 在什么场景下使用非Java堆? 非Java堆的回收不受java yong gc的影响,一般需要手工进行回收。如果大量的使用非Java堆,则丢失了Java 自动垃圾回收的特点。 一...

Alpha_Paser的博客 3815

Java堆、java栈

Java堆: Java堆内存空间在虚拟机启动时创建,是Java虚拟机锁管理的最大内存区域;垃圾收集器的主要区域;它被所有线程共享。堆内存的唯一目的是存放对象实例。 Java堆空间分为老年代和新生代。老年代用于存储经过多次GC(垃圾回收)后,任然存活的对象,或者是创建的大对象(新生代空间不足,会直接将大对象存放在老年代);新生代主要用于存储新创建的对象,新生代又分为Eden区、From Surv...

zhoushimiao1990的博客 981

Java的堆

堆 一、什么是堆 堆就是用数组实现的二叉树,所以它没有使用父指针或者子指针。堆根据“堆属性”来排序,“堆属性”决定了树中节点的位置。 1. 二叉树的顺序存储 2.堆的概念 堆逻辑上是一棵完全二叉树 堆物理上是保存在数组中 满足任意结点的值都大于其子树中结点的值,叫做大堆,或者大根堆,或者最大堆 反之,则是小堆,或者小根堆,或者最小堆 堆的作用就是找最值 二、堆的操作 array 代表存储堆的数组 len代表数组中被视为堆数据的个数 parent代表要调整位置的下标 child代表 parent 左孩

weixin_56401913的博客 509

Java 堆的设计,如何用堆进行排序

Java 学习+面试指南:https://javaxiaobear.cn1、堆的定义堆是计算机科学中一类特殊的数据结构的统称,堆通常可以被看做是一棵完全二叉树的数组对象。1、堆的特性它是完全二叉树,除了树的最后一层结点不需要是满的,其它的每一层从左到右都是满的,如果最后一层结点不是满的,那么要求左满右不满。它是由数组实现的...

weixin_40580106的博客 201

java 最小堆_Java最小堆实现

package boke.heap1;/*** 堆结点** @since jdk1.5及其以上* @author 毛正吉* @version 1.0* @date 2010.05.24**/public class Node {private int iData; // 结点数据是整型public Node(int key) {iData = key;}/*** setKey** @param i...

weixin_29715563的博客 965

浅谈java 堆污染

java 堆污染 Heap pollution(堆污染), 指的是当把一个不带泛型的对象赋值给一个带泛型的变量时, 就有可能发生堆污染. 由于定义带泛型变量时并不强制指定泛型类型, 因此如果借此发生狸猫换太子的操作的话, 那么就会导致堆污染. 堆污染在编译时并不会报错, 只会在编译时提示有可能导致堆污染的警告. 在运行时,如果发生了堆污染, 那么就会抛出类型转换异常. 1. 堆污染场景 1.1...

Java 程序源 2449

java 堆实现

java 堆实现 代码 public static void buildheap(int[] a , int heaplength) { for(int i = a.length/2-1; i >= 0; i–) { heapify(a, i, heaplength); } } //小顶堆 public static void heapify(int a[], int i, int hea...

qq_42716518的博客 318

Java堆详细介绍

Java堆是JVM内存结构中的一个区域,用于存储所有Java对象实例和数组。堆内存在Java程序运行时动态分配,生命周期贯穿于应用程序的整个运行周期。Java对象在堆上分配内存,当对象不再被引用时,垃圾收集器会回收这些对象所占用的内存。堆是线程共享的,这意味着所有的Java线程都可以访问堆中的对象。Java堆是Java虚拟机内存管理的重要组成部分,负责存储所有Java对象和数组。堆内存的结构包括年轻代、老年代和元空间,不同代的内存管理策略和垃圾收集机制各不相同。

Flying_Fish_roe的博客 1356

堆(Java实现)

堆,PriorityQueue

2302_81500764的博客 1040
上一篇: 双亲委派机制的特点
下一篇: leetcode104. 二叉树的最大深度
Dim_Jerry
博客等级 码龄8年 14粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值