java内存分布的实现方法

发布时间:2021-07-13 13:39:45 作者:chen
来源:亿速云 阅读:162

本篇内容主要讲解“java内存分布的实现方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java内存分布的实现方法”吧!

目录

一、堆内内存

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

1.1 年轻代-Young Generation

1.2 老年代 (Old Generation)

1.3 元数据(Meta space)

1.4 小结

java内存分布的实现方法

1、默认参数:

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

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

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

2、新老年代相关jvm参数

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

Major GC / 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回收器就好了

到此,相信大家对“java内存分布的实现方法”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

推荐阅读:
  1. 虚函数和虚拟继承的内存分布
  2. java实现继承的方法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:Vue封装全局toast组件的应用

下一篇:Ubuntu中怎么安装Rippled服务器

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》