1 DeathBless 2020-12-31 17:50:02 +08:00 把比例调一下不是更方便 除非你用堆外内存 不然不可能吧 |
2 micean 2020-12-31 18:04:15 +08:00 像 netty 这种有玩堆外内存的,堆内的就不了解了 嫌本地缓存占用空间大,为什么不把缓存交给 redis 之类的应用? |
3 YouLMAO 2020-12-31 18:36:52 +08:00 堆里面?你啥意思?颠覆 jvm 概率么 native 或者叫 off heap, 代码 java.nio.DirectByteBuffer unsafe.allocateMemory |
4 imjamespond 2020-12-31 18:46:37 +08:00 via Android Ehcache 了解下? |
6 MeteorCat 2020-12-31 19:25:27 +08:00 via Android JNI 这样的吗? |
7 gabon 2020-12-31 19:49:21 +08:00 via Android 前两天刚看到一个开源软件在堆开辟空间自己管理,现在怎么也想不起来了,好难受 |
8 littlewing 2020-12-31 19:53:03 +08:00 自己管理内存堆外就行了,为啥非得在堆内 |
9 gabon 2020-12-31 19:53:47 +08:00 via Android got it 。Flink 解决内存问题的核心思想类似于 Spark 的 Project Tungsten 和 HBase 的 BlockCache:在 JVM 堆内或堆外实现显式的内存管理,即用自定义内存池来进行内存块的分配和回收,并将对象序列化后存储到内存块。因为内存可以被精准地申请和释放,而且序列化的数据占用的空间可以被精确计算,所以组件可以对内存有更好的掌控,这种内存管理方式也被认为是相比 Java 更像 C 语言化的做法。 Flink 将 TaskManager 的运行时 JVM heap 分为 Network Buffers 、MemoryManager 和 Free 三个区域,如下图所示: |
10 gabon 2020-12-31 19:54:43 +08:00 via Android http://tang.love/2019/04/21/overview_of_flink/ |
![]() | 11 wysnylc 2020-12-31 20:36:06 +08:00 via Android 堆内应该不行,堆外可以如 netty 堆内不行的原因是 gc 没有白名单类似的策略 |
12 YouLMAO 2020-12-31 20:45:37 +08:00 via Android @gabon 没鸟用的,flink 是用二进制数据放在老年代避免 gc 的,贴主说他不想反序列化,要对象,这样的唯一出路就是加入 Amazon 团队,他们在造一个新 Jvm,拥有自主知识产权 |
![]() | 13 mind3x 2020-12-31 22:12:49 +08:00 |
![]() | 15 DoctorCat 2020-12-31 22:16:26 +08:00 不是不行,但怎么判断你这策略是最佳实践? 或者把 gc 换成 G1 试试 |
![]() | 16 DoctorCat 2020-12-31 22:19:02 +08:00 把 CMS 换成 G1 试试 |
17 xianyuya OP 大家说的堆外其实有想过,也有一部分数据是采用 mmap 的方式读取的,不过放在堆外的数据,反序列化到堆内创建对象的时候就会有额外的内存开销。 其实我最原始的问题是有一份一天一更新的只读数据( 1g 左右,因为性能问题所以需要放在内存中),要怎么处理才能尽可能在尽可能少占用内存的情况下,每天替换数据时不引起 stw,不对正在提供服务的 rpc 线程产生影响 |
![]() | 18 Joker123456789 2021-01-05 15:40:38 +08:00 static Map ; 单例类; 都可以实现这个需求吧 |
19 sueking 2021-01-22 12:17:28 +08:00 阿里自定义 JDK 实现了 叫 GCIH |