protobuf 직렬화로 인해 .net 핵심 응용 프로그램의 문제가 발생하는 이유를 찾으려고합니다. 따라서 테스트 응용 프로그램을 작성했으며 일부 이상한 점이 있습니다. Task를 사용하고 Thread를 사용할 경우 메모리 누수가 없다면 메모리 누수가 발생합니다. dotMemory의.net 코어에서 ProtoBuf 직렬화시 메모리 누수
internal class Program
{
private static void Main(string[] args)
{
var data = new Person
{
Id = 1,
Name = new string('q', 10000),
Address = new Address
{
Line1 = new string('w', 10000),
Line2 = new string('e', 10000)
}
};
//for (var i = 0; i < 100; i++)
//{
// var thread = new Thread(() =>
// {
// while (true)
// try
// {
// var b = ProtoSerialize(data);
// Person serializedPerson;
// using (Stream stream2 = new MemoryStream(b))
// {
// serializedPerson = Serializer.Deserialize<Person>(stream2);
// }
// }
// catch (Exception e)
// {
// Console.WriteLine(e);
// }
// });
// thread.Start();
//}
for (var i = 0; i < 100; i++)
{
new Task(() =>
{
while (true)
{
var b = ProtoSerialize(data);
Person serializedPerson;
using (Stream stream2 = new MemoryStream(b))
{
serializedPerson = Serializer.Deserialize<Person>(stream2);
}
}
}).Start();
}
Console.ReadLine();
}
public static byte[] ProtoSerialize<T>(T record) where T : class
{
using (var stream = new MemoryStream())
{
Serializer.Serialize(stream, record);
return stream.ToArray();
}
}
}
[ProtoContract]
public class Person
{
[ProtoMember(1)]
public int Id { get; set; }
[ProtoMember(2)]
public string Name { get; set; }
[ProtoMember(3)]
public Address Address { get; set; }
}
[ProtoContract]
public class Address
{
[ProtoMember(1)]
public string Line1 { get; set; }
[ProtoMember(2)]
public string Line2 { get; set; }
}
및 스크린 :
작업 예는 난 스레드 (주석 코드)
for (var i = 0; i < 100; i++)
{
var thread = new Thread(() =>
{
while (true)
try
{
var b = ProtoSerialize(data);
Person serializedPerson;
using (Stream stream2 = new MemoryStream(b))
{
serializedPerson = Serializer.Deserialize<Person>(stream2);
}
}
catch (Exception e)
{
Console.WriteLine(e);
}
});
thread.Start();
}
그래서 질문은 :
내가 뭔가 잘못하고 있니?
왜 이런 일이 발생합니까?
어떻게해야할까요?
p.s.
protobuf - 그물은 2.3.2
.NET 코어
UPD1 2.0
: 메인 스레드에서 GC.Collect를 호출 아무것도
열린 스냅 샷 비교, "새"개체 열기,이 개체가 무엇인지, 왜 그 개체가 메모리에 저장되었는지 확인하십시오. 메모리 프로파일 러 전원을 사용하십시오. –
참고 : 어제 새로운 빌드가 추가되어 * 매우 구체적인 * 메모리 시나리오를 처리했습니다. 관련이 있는지는 확실하지 않지만 시도해 볼 수는 있습니다. –