广告
返回顶部
首页 > 资讯 > 后端开发 > Python >java内存分布实现代码
  • 725
分享到

java内存分布实现代码

2024-04-02 19:04:59 725人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录一、堆内内存1.1 年轻代-Young Generation1.2 老年代 (Old Generation)1.3 元数据(Meta space)1.4 小结二、堆外内存2.1

一、堆内内存

堆内内存分为三大部分,年轻代 , 老年代 和 元空间,所以 堆内内存 = 年轻代 + 老年代 + 元空间,下面细聊下三部分

1.1 年轻代-Young Generation

  • 存放的是new 生成的对象
  • 年轻代是为了尽可能快速的回收掉那些生命周期短的对象
  • Eden
    • 大部分对象在Eden区中生成
    • 当Eden区满时,会做一次young gc, 依然存活的对象将被复制到Survivor区, 当一个Survivor 区满时, 此区的存活对象将被复制到另外一个Survivor区
  • Survivor(通常2个)
    • 当两个 Survivor 区 都满时, 从第一个Survivor 区 被复制过来 且 依旧存活的 对象,超过一定年龄的会被复制到 老年代(Tenured)
    • Survivor 的两个区是对称的, 没有先后关系, 所有同一个区中可能同时存在从Eden复制过来的对象 和 从前一个 Survivor 复制过来的对象。
    • 把age大于-XX:MaxTenuringThreshold的对象晋升到老年代;(对象每在Survivor区熬过一次,其age就增加一岁);

1.2 老年代 (Old Generation)

  • 存放了在年轻代中经历了N次垃圾回收后仍存活的对象, 是一些生命周期较长的对象.
  • 存放那些创建的时候占用空间比较大的对象,这些对象不经历eden,直接进入老年代,大对象(大小大于-XX:PretenureSizeThreshold的对象)

1.3 元数据(Meta space)

  • 存放类的数据
  • 存放静态文件, 如静态类和方法等。持久代对垃圾回收没有显著影响, 但是有些应用可能动态生成或者调用一些class, 比如Hibernate, mybatis 等, 此时需要设置一个较大的持久代空间来存放这些运行过程中新增的类。
  • 设置持久代大小参数: -XX:MetaspaceSize, -XX:MaxMetaspaceSize

1.4 小结

图片

1、默认参数:

老年代占整个堆内存的2/3

年轻代占整个内存的1/3

Eden 区域占 整个年轻代的80%,From 和 To 两个生存者区域各占10%

2、新老年代相关jvm参数

  • -XX:NewRatio 设置新老年代比例,如-XX:NewRatio=5 代表 新老年代比例为1:5,新生代占用堆内存的1/6,老年代占用5/6;
  • -XX:SurvivorRatio 设置新生代中eden和两个2个Survivo区域大小的比例,如-XX:SurvivorRatio=8,则eden:s1:s2=8:1:1,默认比例就是为8:1:1.

3、young GC发生在新生代中,FUll GC 发生在整个堆空间中,一般是老年代空间不够用就会出发FULL GC

二、堆外内存

我们的游戏服务器使用的是Netty,所以单说下netty,Netty的ByteBuffer采用DIRECT BUFFERS,使用堆外直接内存进行Socket读写,不需要进行字节缓冲区的二次拷贝,堆外内存的零拷贝.提升了效率。因为操作系统内核直接把数据写到堆外内存里,不需要像普通api一样,操作系统内核缓存一份,程序读的时候再复制一份到程序空间。

2.1 java中在堆外开辟内存的方法有两种

1.用DirectBufferByteBuffer.allocateDirect(size)

2.用JNI写java的C/C++扩展,在扩展里不牵扯JVM自己向系统搞内存出来。

2.2 使用堆外内存的优点

1.减少了垃圾回收因为垃圾回收会暂停其他的工作。

2.加快了复制的速度堆内在flush到远程时,会先复制到直接内存(非堆内存),然后在发送;而堆外内存相当于省略掉了这个工作。

2.3堆外内存的缺点

内存难以控制,使用了堆外内存就间接失去了JVM管理内存的可行性,改由自己来管理,当发生内存溢出时排查起来非常困难。

三、垃圾回收

3.1 垃圾回收(GC)

Minor GC

  • 一般当新对象生成并且在Eden申请空间失败时就会触发MinorGC, 对Eden区域进行GC, 清除非存活对象, 并且把尚存活的对象移动到Survivor区, 然后整理两个Survivor区。
  • 该方式的GC是对年轻代的Eden区进行,不会影响到年老代。
  • 由于大部分对象是从Eden区开始的, 所以Eden区的GC会很频繁。

Major GC / Full GC

  • 老年代(Tenured) 被写满
  • 持久代(Permanent) 被写满
  • System.gc() 被显示调用
  • 上一次GC之后Heap 的各域分配策略动态变化
  • 对整个堆进行整理。
  • 所消耗的时间较长, 所以要尽量减少 Full GC 的次数

出现Full GC经常会伴随至少一次的Minor GC(不是绝对,Parallel Sacvenge收集器就可以选择设置Major GC策略);

Major GC速度一般比Minor GC慢10倍以上。

3.2 GC root

程序把所有的引用关系看作一张图,从一个节点GC ROOT开始,寻找对应的引用节点,找到这个节点以后,继续寻找这个节点的引用节点,当所有的引用节点寻找完毕之后,剩余的节点则被认为是没有被引用到的节点,即无用的节点,是需要释放内存的对象。

java中可作为GC Root的对象有

1.虚拟机栈中引用的对象(本地变量表)

2.方法区中静态属性引用的对象

3方法区中常量引用的对象

4.本地方法栈中引用的对象(Native对象)

3.3常用垃圾回收器

垃圾收集器就是内存回收的具体实现。下面介绍一下虚拟机提供的几种垃圾收集器

Serial收集器(复制算法)

新生代单线程收集器,标记和清理都是单线程,优点是简单高效。

Serial Old收集器(标记-整理算法)

老年代单线程收集器,Serial收集器的老年代版本。

ParNew收集器(停止-复制算法) 

新生代收集器,可以认为是Serial收集器的多线程版本,在多核CPU环境下有着比Serial更好的表现。

Parallel Scavenge收集器(停止-复制算法)

并行收集器,追求高吞吐量,高效利用CPU。吞吐量一般为99%, 吞吐量= 用户线程时间/(用户线程时间+GC线程时间)。适合后台应用等对交互相应要求不高的场景。

Parallel Old收集器(停止-复制算法)

Parallel Scavenge收集器的老年代版本,并行收集器,吞吐量优先

CMS(Concurrent Mark Sweep)收集器(标记-清理算法)

高并发、低停顿,追求最短GC回收停顿时间,cpu占用比较高,响应时间快,停顿时间短,多核cpu 追求高响应时间的选择

G1(Garbage-First)

现在最新的回收器,新生代和老年代通用

新生代收集器使用的收集器:SerialPraNewParallel Scavenge

老年代收集器使用的收集器:Serial OldParallel OldCMS

我们线上服务器使用的是G1 收集器

四、总结

上面列举了很多的内容,但是需要记住的下面几点就可以了

1、对象的迁移路径:出生在Eden,然后在Survivor 区域来回迁移,迁移一次一次增加一次年龄,年龄太大的直接进入老年代

2、 Eden区域满了 产生 minor Gc

老年代满了产生 full gc

3、记住回收器是执行gc 的,选择最新的G1回收器就好了

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: java内存分布实现代码

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

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

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

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

下载Word文档
猜你喜欢
  • java内存分布实现代码
    目录一、堆内内存1.1 年轻代-Young Generation1.2 老年代 (Old Generation)1.3 元数据(Meta space)1.4 小结二、堆外内存2.1 ...
    99+
    2022-11-12
  • java内存分布的实现方法
    本篇内容主要讲解“java内存分布的实现方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java内存分布的实现方法”吧!目录一、堆内内存1 年轻代-Young Generation2 老年代 ...
    99+
    2023-06-20
  • java实现分布式锁的代码怎么写
    在Java中实现分布式锁可以使用以下几种方式:1. 基于数据库的实现:   - 创建一个数据库表,表中有一个唯一索引字段用...
    99+
    2023-10-23
    java
  • Java编程redisson实现分布式锁代码示例
    最近由于工作很忙,很长时间没有更新博客了,今天为大家带来一篇有关Redisson实现分布式锁的文章,好了,不多说了,直接进入主题。1. 可重入锁(Reentrant Lock)Redisson的分布式可重入锁RLock Java对象实现了j...
    99+
    2023-05-31
    java redisson 分布式锁
  • java基于mongodb实现分布式锁的示例代码
    目录原理 实现 使用  原理 通过线程安全findAndModify 实现锁 实现 定义锁存储对象: @Data @NoArgsConstruc...
    99+
    2022-11-12
  • java基于jedisLock—redis分布式锁实现示例代码
    分布式锁是啥?单机锁的概念:我们正常跑的单机项目(也就是在tomcat下跑一个项目不配置集群)想要在高并发的时候加锁很容易就可以搞定,java提供了很多的机制例如:synchronized、volatile、ReentrantLock等锁的...
    99+
    2023-05-30
    jedislock redis 分布式锁
  • JavaScript实现瀑布流布局的代码分享
    目录前言如何实现html部分css部分js部分瀑布流布局的优点前言 不知道大家在线上购物的时候有没有发现到,自己逛起来根本就停不下来,越往下翻越是觉得就会出现需要的东西。这就是很多电...
    99+
    2023-05-15
    JavaScript实现瀑布流布局 JavaScript瀑布流布局 JavaScript瀑布流
  • Java中的内存分布有哪些
    今天就跟大家聊聊有关Java中的内存分布有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java内存分布:Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不...
    99+
    2023-05-31
    java 内存分布 ava
  • 基于Redis分布式锁的实现代码
    概述 目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题。分布式的CAP理论告诉我们“任何一个分布式系统都无法同时满足一致性(Consistency)、可用性(...
    99+
    2022-10-18
  • Android内部存储与外部存储实例代码分析
    今天小编给大家分享一下Android内部存储与外部存储实例代码分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。什么是内部存...
    99+
    2023-07-05
  • 详细总结Java堆栈内存、堆外内存、零拷贝浅析与代码实现
    目录一、堆栈内存二、堆外内存三、零拷贝一、堆栈内存 堆栈内存,顾名思义,指的是堆内存以及栈内存,其中,堆内存是由Java GC进行管理的内存区域,而栈内存则是线程内存。关于栈内存,这...
    99+
    2022-11-12
  • Java图文分析之继承内存布局
    目录一、初步了解继承的内存布局(1) 继承内存布局初探(2) Object 类(3) 同名的成员变量二、更复杂的继承的内存布局一、初步了解继承的内存布局 (1) 继承内存布局初探 看...
    99+
    2022-11-13
  • Java实现TFIDF算法代码分享
    算法介绍概念     TF-IDF(term frequency–inverse document frequency)是一种用于资讯检索与资讯探勘的常用加权技术。TF-IDF是一种统计方法,用以评估...
    99+
    2023-05-30
    java tfidf算法 ava
  • springboot+zookeeper实现分布式锁的示例代码
    目录依赖本地封装配置测试代码JMeter测试InterProcessMutex内部实现了zookeeper分布式锁的机制,所以接下来我们尝试使用这个工具来为我们的业务加上分布式锁处理...
    99+
    2022-11-13
  • PHP分布式部署代码同步Git实现
    PHP 分布式部署后 代码自动同步实现 项目架构如下: 需要更新代码时我们只需要把代码传到主服务器后通过定时任务主服务器自动push 代码到Git服务端,之后其他从服务器则自动从Git云端拉取最新的...
    99+
    2023-09-04
    git php 分布式
  • Java实现本地缓存、分布式缓存及多级缓存
    以下均为自己参考其它博主文章或自己理解整理而成,如有错误之处,欢迎在评论区批评指正! 0. 缓存简介        像MySql等传统的关系型数据库已经不能适用于所有的业务场景,比如电商系统的秒杀场景,APP首页的访问流量高峰场景,很容易造...
    99+
    2023-09-17
    java
  • 如何使用Java API实现分布式存储?
    分布式存储是指将数据分散存储在多个物理设备上,从而提高数据的可靠性和可用性,同时也可以提高数据的处理速度和存储容量。Java是一种流行的编程语言,它提供了丰富的API,可以帮助我们实现分布式存储。 使用Java API实现分布式文件系统 ...
    99+
    2023-10-01
    api 分布式 存储
  • C语言动态内存管理实例代码分析
    这篇文章主要介绍了C语言动态内存管理实例代码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言动态内存管理实例代码分析文章都会有所收获,下面我们一起来看看吧。1.动态内存开辟的原因常见的内存开辟方式int...
    99+
    2023-07-02
  • Python布尔值实例代码分析
    本文小编为大家详细介绍“Python布尔值实例代码分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python布尔值实例代码分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。布尔表示两值之一:True 或 F...
    99+
    2023-07-06
  • java代码实例分析
    这篇文章主要介绍“java代码实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“java代码实例分析”文章能帮助大家解决问题。一、几个坑爹代码的目录这样使用 StringBuffer 的方法有什...
    99+
    2023-06-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作