我有一些ASP.NET核心项目,我正在寻找消耗的内存。我只是被它吓坏了。这不是一个大项目。我有几个控制器,它消耗约350MB的Ram,这对于Web服务器来说是很大的内存。
我的问题是我可以减少它吗?我有一个想法是要为您构造而不是为数据关系模型建立模型,但这并不能像我想的那样减少这种情况。还有其他方法,我喜欢尝试所有方法:)
最后,我现在的ASP.NET核心是一个非常复杂的框架,这意味着我不会将其用于小型项目,这只是出于教育目的。最后一个问题:内存是大问题吗?
我的项目的屏幕截图:

我更大的控制器:)
using System.Linq;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using RustWiki.Data;
using RustWiki.Models.WikiViewModels;
namespace RustWiki.Controllers.api
{
[Produces("application/json")]
public class TableManagerController : Controller
{
private readonly ApplicationDbContext _context;
public TableManagerController(ApplicationDbContext context)
{
_context = context;
}
protected override void Dispose(bool disposing)
{
_context.Dispose();
base.Dispose(disposing);
}
//Get
[HttpGet]
[Route("/api/ArmorTypes")]
public IActionResult GetArmorTypes() => Ok(_context.ArmorTypes.ToList());
[HttpGet]
[Route("/api/Cloating")]
public IActionResult GetCloating() => Ok(_context.Cloating.Include(c => c.ArmorType).Include(c => c.Defencis).Include(c => c.Item.ItemType).ToList());
[HttpGet]
[Route("/api/Defencis")]
public IActionResult GetDefences() => Ok(_context.Defencis.ToList());
[HttpGet]
[Route("/api/Dmgs")]
public IActionResult GetDmg() => Ok(_context.Dmgs.ToList());
[HttpGet]
[Route("/api/Equipment")]
public IActionResult GetEquipment() => Ok(_context.Equipment.Include(e => e.Dmg).Include(e => e.Item.ItemType).ToList());
[HttpGet]
[Route("/api/Items")]
public IActionResult GetItems() => Ok(_context.Items.Include(i => i.ItemType).ToList());
[HttpGet]
[Route("/api/ItemTypes")]
public IActionResult GetItemType() => Ok(_context.ItemTypes.ToList());
[HttpGet]
[Route("/api/Resources")]
public IActionResult GetResource() => Ok(_context.Resources.ToList());
//Delete
[HttpDelete]
[Route("/api/ArmourTypes/{id}")]
public IActionResult DelArmourType(int id) => Delete(_context.ArmorTypes, id);
[HttpDelete]
[Route("/api/Cloating/{id}")]
public IActionResult DelCloating(int id) => Delete(_context.Cloating, id);
[HttpDelete]
[Route("/api/Defences/{id}")]
public IActionResult DelDefencis(int id) => Delete(_context.Defencis, id);
[HttpDelete]
[Route("/api/Dmgs/{id}")]
public IActionResult DelDmg(int id) => Delete(_context.Dmgs, id);
[HttpDelete]
[Route("/api/Equipments/{id}")]
public IActionResult DelEquipment(int id) => Delete(_context.Equipment, id);
[HttpDelete]
[Route("/api/Items/{id}")]
public IActionResult DelItem(int id) => Delete(_context.Items, id);
[HttpDelete]
[Route("/api/ItemTypes/{id}")]
public IActionResult DelItemType(int id) => Delete(_context.ItemTypes, id);
[HttpDelete]
[Route("/api/Resources/{id}")]
public IActionResult DelResource(int id) => Delete(_context.Resources, id);
private IActionResult Delete<T>(DbSet<T> set, int id) where T : class
{
var obj = set.SingleOrDefault(delegate (T o)
{
return (o as IWikiModel)?.Id == id;
});
if (obj == null)
return NotFound();
set.Remove(obj);
_context.SaveChanges();
return Ok(obj);
}
//Create
[HttpPost]
[Route("/api/ArmourType")]
public IActionResult CreateArmourType([FromBody]ArmorType type)
{
return Ok();
}
}
}
Run Code Online (Sandbox Code Playgroud)
感谢所有的答案。
当你说你的 API 消耗大量内存时,真的吗?您目前正在做什么基准测试?您是否在本地运行它并查看内存消耗?Debug如果是这样,那么除了应用程序代码之外,还有很多东西在运行,例如调试符号,它们会增加看似很小的应用程序的内存占用量。
如果您确实需要查找内存泄漏或高消耗(这是特定于您的情况的指标),那么请使用经过尝试和测试的分析器,例如ANTS Profiler。
当 ASP.NET Core 应用程序启动时,GC:
为初始堆段保留一些内存。加载运行时时提交一小部分内存。
前面的内存分配是出于性能原因而完成的。性能优势来自连续内存中的堆段。
此外,GC模式Server GC(默认)或Workstation GC对应用程序的内存使用有很大影响。
工作集从 500 MB 下降到 70 MB。
GC 每秒执行多次第 0 代收集,而不是每两秒一次。
GC 大小从 300 MB 减少到 10 MB。
在大多数情况下,服务器 GC 是理想的选择。但是,对于小型应用程序的流量要求不高,则应考虑 GC 模式。
尽管看起来一个基本的应用程序消耗了大量内存,但这里重要的是,当应用程序启动时,GC 会获取一块连续的内存。
这意味着一旦您的应用程序启动,就已经为您的用户对象保留了内存,并且运行时不需要向操作系统请求更多内存。如果应用程序不泄漏内存,则在分配和收集对象时内存使用量将保持稳定。
| 归档时间: |
|
| 查看次数: |
8349 次 |
| 最近记录: |