Python 官方文档:入门教程 => 点击学习
目录一、堆内内存1.1 年轻代-Young Generation1.2 老年代 (Old Generation)1.3 元数据(Meta space)1.4 小结二、堆外内存2.1
堆内内存分为三大部分,年轻代 , 老年代 和 元空间,所以 堆内内存 = 年轻代 + 老年代 + 元空间,下面细聊下三部分
-XX:MetaspaceSize, -XX:MaxMetaspaceSize
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一样,操作系统内核缓存一份,程序读的时候再复制一份到程序空间。
1.用DirectBufferByteBuffer.allocateDirect(size)
2.用JNI写java的C/C++扩展,在扩展里不牵扯JVM自己向系统搞内存出来。
1.减少了垃圾回收因为垃圾回收会暂停其他的工作。
2.加快了复制的速度堆内在flush到远程时,会先复制到直接内存(非堆内存),然后在发送;而堆外内存相当于省略掉了这个工作。
内存难以控制,使用了堆外内存就间接失去了JVM管理内存的可行性,改由自己来管理,当发生内存溢出时排查起来非常困难。
Minor GC
Major GC / Full GC
出现Full GC经常会伴随至少一次的Minor GC(不是绝对,Parallel Sacvenge收集器就可以选择设置Major GC策略);
Major GC速度一般比Minor GC慢10倍以上。
程序把所有的引用关系看作一张图,从一个节点GC ROOT开始,寻找对应的引用节点,找到这个节点以后,继续寻找这个节点的引用节点,当所有的引用节点寻找完毕之后,剩余的节点则被认为是没有被引用到的节点,即无用的节点,是需要释放内存的对象。
java中可作为GC Root的对象有
1.虚拟机栈中引用的对象(本地变量表)
2.方法区中静态属性引用的对象
3方法区中常量引用的对象
4.本地方法栈中引用的对象(Native对象)
垃圾收集器就是内存回收的具体实现。下面介绍一下虚拟机提供的几种垃圾收集器
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)
现在最新的回收器,新生代和老年代通用
新生代收集器使用的收集器:Serial
、PraNew
、Parallel Scavenge
老年代收集器使用的收集器:Serial Old
、Parallel Old
、CMS
我们线上服务器使用的是G1 收集器
上面列举了很多的内容,但是需要记住的下面几点就可以了
1、对象的迁移路径:出生在Eden,然后在Survivor 区域来回迁移,迁移一次一次增加一次年龄,年龄太大的直接进入老年代
2、 Eden区域满了 产生 minor Gc
老年代满了产生 full gc
3、记住回收器是执行gc 的,选择最新的G1回收器就好了
本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注编程网的更多内容!
--结束END--
本文标题: java内存分布实现代码
本文链接: https://lsjlt.com/news/130381.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0