C#内存文件映射物理内存和虚拟缓存都上涨的原因

明天会怎样 2018-09-19 11:20:40
C#内存文件映射物理内存和虚拟缓存都上涨,换成固态硬盘存储,物理内存就没有上涨,但缓存还是不停的涨,直到16G(内存条大小),然后CPU使用率就开始变高,处理速度就成变慢趋势,C#内存文件映射如何解决内存和缓存上涨的问题?
...全文
659 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
明天会怎样 2018-09-25
  • 打赏
  • 举报
回复
引用 6 楼 xian_wwq 的回复:
调用MapViewOfFile
读取需要的数据
调用UnmapViewOfFile
这个操作必须是成对的


是成对的,主要是认为UnmapViewOfFile释放有延后,没及时释放又在循环新的申请
xian_wwq 2018-09-25
  • 打赏
  • 举报
回复
只要成对,那就不可能内存泄露
UnmapViewOfFile直接调用的系统API,
不会有类似GC的延后释放
除非有异常出现导致
释放未调用

xian_wwq 2018-09-20
  • 打赏
  • 举报
回复
调用MapViewOfFile
读取需要的数据
调用UnmapViewOfFile
这个操作必须是成对的
xuzuning 2018-09-19
  • 打赏
  • 举报
回复
你都做了什么?
明天会怎样 2018-09-19
  • 打赏
  • 举报
回复
引用 3 楼 xian_wwq 的回复:
贴下代码,
重点是释放操作的代码


public virtual void Close()
{
if (m_pViewOfFile != IntPtr.Zero)
{
WinAPI.UnmapViewOfFile(m_pViewOfFile);
m_pViewOfFile = IntPtr.Zero;
}
if (m_hfilemap != 0)
{
WinAPI.CloseHandle(m_hfilemap);
m_hfilemap = 0;
}
if (m_hfile != WinAPI.INVALID_HANDLE_VALUE)
{
WinAPI.CloseHandle(m_hfile);
m_hfile = WinAPI.INVALID_HANDLE_VALUE;
}
System.GC.Collect();
System.GC.SuppressFinalize(this);
if (Environment.OSVersion.Platform == PlatformID.Win32NT)
{
Global_MB_Para.SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
}
}

protected bool CreateMapViewOfFile(Int64 dwFileOffset)
{
if (dwFileOffset < 0) return false;

Int64 n = dwFileOffset / PAGE_SIZE + 1;
Int64 nViewOffset = (n - 1) * PAGE_SIZE;

if (nViewOffset > m_dwFileSize) return false;
if (m_pViewOfFile != IntPtr.Zero)
{
System.Web.Caching.Cache _cache = System.Web.HttpRuntime.Cache;
_cache.Remove(m_pViewOfFile.ToString());
WinAPI.UnmapViewOfFile(m_pViewOfFile);
m_pViewOfFile = IntPtr.Zero;
}
if (n * PAGE_SIZE > m_dwFileSize)
{
if (!GrowFileMap()) return false;
}
m_pViewOfFile = WinAPI.MapViewOfFile(m_hfilemap,
WinAPI.FILE_MAP_WRITE,
HIDWORD(nViewOffset),
LODWORD(nViewOffset),
PAGE_SIZE);
if (m_pViewOfFile == IntPtr.Zero) return false;
m_dwViewCurrentPosition = (uint)(dwFileOffset - nViewOffset);
m_dwViewOfMapOffset = nViewOffset;
return true;
}
明天会怎样 2018-09-19
  • 打赏
  • 举报
回复
public virtual void Close()
{
if (m_pViewOfFile != IntPtr.Zero)
{
WinAPI.UnmapViewOfFile(m_pViewOfFile);
m_pViewOfFile = IntPtr.Zero;
}
if (m_hfilemap != 0)
{
WinAPI.CloseHandle(m_hfilemap);
m_hfilemap = 0;
}
if (m_hfile != WinAPI.INVALID_HANDLE_VALUE)
{
WinAPI.CloseHandle(m_hfile);
m_hfile = WinAPI.INVALID_HANDLE_VALUE;
}
System.GC.Collect();
System.GC.SuppressFinalize(this);
if (Environment.OSVersion.Platform == PlatformID.Win32NT)
{
Global_MB_Para.SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
}
}

protected bool CreateMapViewOfFile(Int64 dwFileOffset)
{
if (dwFileOffset < 0) return false;

Int64 n = dwFileOffset / PAGE_SIZE + 1;
Int64 nViewOffset = (n - 1) * PAGE_SIZE;

if (nViewOffset > m_dwFileSize) return false;
if (m_pViewOfFile != IntPtr.Zero)
{
System.Web.Caching.Cache _cache = System.Web.HttpRuntime.Cache;
_cache.Remove(m_pViewOfFile.ToString());
WinAPI.UnmapViewOfFile(m_pViewOfFile);
m_pViewOfFile = IntPtr.Zero;
}
if (n * PAGE_SIZE > m_dwFileSize)
{
if (!GrowFileMap()) return false;
}
m_pViewOfFile = WinAPI.MapViewOfFile(m_hfilemap,
WinAPI.FILE_MAP_WRITE,
HIDWORD(nViewOffset),
LODWORD(nViewOffset),
PAGE_SIZE);
if (m_pViewOfFile == IntPtr.Zero) return false;
m_dwViewCurrentPosition = (uint)(dwFileOffset - nViewOffset);
m_dwViewOfMapOffset = nViewOffset;
return true;
}
xian_wwq 2018-09-19
  • 打赏
  • 举报
回复
贴下代码,
重点是释放操作的代码
明天会怎样 2018-09-19
  • 打赏
  • 举报
回复
高帧率运行的同时,不断内存映射保存数据,文件大小3G,页面缓存,指针申请页面,页面大小8192

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧