Мне кажется, что вы столкнулись с проблемой печально известной фрагментации памяти . Я не уверен, что Кассандра снимает некоторые проблемы фрагментации, но в целом в .NET и, возможно, в любой программе Windows может с этим столкнуться.
Когда вы выбираете что-либо больше 85000 байт (да, нечетное число, но оно есть), объекты сохраняются в куче больших объектов. LOH получает GC только в поколении 2, но, что еще хуже, он уплотняется никогда . Причиной частично является способ реализации ОС .
Результат: когда вы храните объекты, скажем, 2 МБ, 5 МБ, 3 МБ, 2 МБ, 3 МБ, а объекты размером 2 МБ получают GC, у вас потенциально может быть 4 МБ бесплатно. Но если вы затем попытаетесь создать новый объект размером 3 МБ, он не может быть помещен туда из-за фрагментации (2 отверстия по 2 МБ) и перемещается к вершине кучи. В конце концов, это не хватает места. Итак: может быть достаточно памяти, но вы получите OOM независимо от этой фрагментации .
Эта проблема в основном наблюдается в 32-битных x86-приложениях в 64-битной (WOW64) и 32-битной Windows. 64-разрядные приложения также имеют проблему фрагментации, но поскольку виртуальная память намного больше, вы сначала нажимаете на подкачку памяти (становясь очень медленной), прежде чем сталкиваетесь с фактическими проблемами фрагментации.
Если это действительно проблема (вы можете проверить фрагментацию визуально с помощью VMMap и WinDbg ), вы можете решить эту проблему, создав большой пул байтов и повторно используя свой собственный пул , таким образом предотвращая фрагментацию.