double[] a;
private void button1_Click(object sender, EventArgs e) {
a = new double[2 * 10000 * 10000];
}
private void button2_Click(object sender, EventArgs e) {
a = new double[1 * 10000 * 10000];
}
private void button3_Click(object sender, EventArgs e) {
a = new double[(int) (0.5 * 10000 * 10000)];
}
일부러 복잡한거 없으라고,
GC.Collect 다 뺐다.
아예 새 프로젝트에 저것만 만들어 넣었어.
아예 새로 실행하며 테스트하라고.
물론 저대로 해도 버튼 1번은 안먹힌다.
3번은 막눌러도 되고, 2번은 GC.Collect를 안하니 2번째에서 막히고.
가만 생각해보니,
기본자료형은 new 가 붙어도 stack 되는거라면 stack으로 간다던데,
stack이라면 2,3번 버튼도 안되어야하는거 아니냐?
stack 윈도우 기본이 1MB 인걸로 아는데.
그럼 정확하게 힙으로 하려면 어떻게 해야됨??
기본 자료형이라도 배열은 전부 힙에 할당되고 닷넷 프로그램의 메모리는 전부 관리를 해야 하기 때문에 32비트 메모리 제한과는 상관없이 약 800메가 정도고 64비트에서는 약 1200메가 정도임
ㄴ 그러니까 C# 32비트는 닥치고 메모리제한이 800메가 정도라는거임? 뭐 이런.... 좀 심하잖아요 이건. ㅠㅠ
어, 근데 뭔가 좀 이상한데. 64비트가 1200메가면 1.2기가?? 이건 말이 안되지 않음? 뭔가 좀 이상한데... 방급 64비트로 빌드해서 해봤는데 얘는 2억 되는데, 작업관리자 보면 1.6GB정도 잘 할당되는데? 지금 컴이 메모리 4GB 짜리라 테스트엔 한계가 있겠지만, 64비트응용프로그램 메모리 제한은 수십기가 이상인 걸로 아는데...
엌ㅋㅋㅋㅋㅋㅋㅋ 지금 테스트하느라 띄워져 있던거 다 끄고 하고 왔는데, 64비트 닷넷은 2GB가 한계네 미친 ㅋㅋㅋㅋㅋㅋㅋ 32비트 VB6 C++이랑 또이또이냨ㅋㅋㅋㅋㅋㅋㅋㅋ
C++ 64비트는 가상메모리까지 빨아서 double 6억개도 가능하더만. 물리 메모리 4GB인데 4.8GB 할당성공... ㄷㄷㄷ
닷넷정보도 찾았다. .NET 4.5 의 2GB 힙 한계 극복
http://www.sysnet.pe.kr/Default.aspx?mode=2&sub=0&detail=1&pageno=0&wid=1403&rssMode=1&wtype=0
내가 빌드한게 .NET 4.0이라 2GB로 제한되는거였나? 저기 내용보면 4.5라도 따로 옵션줘야하네.
오늘 닷넷에 대해 개실망. 설마 32비트 800MB에 64비트 2GB는 생각도 못해봤자너.
진짜 미친건 800MB도 아니라는거. 예를들어 800MB 할당하고 GC.Collect 했는데, 이때 이거 회수를 못하면 다시 800MB 할당을 못함. 즉 800MB + 800MB 상황이 됨. 그래서 400MB로 줄어드는 미친 상황 발생. 실질적으로 딱 2번만이라도 재할당이 요구되는 경우, 프로그램을 안뻗게 하려면 최대 가용메모리가 400MB라는거임. 다른 것들은 2GB를 통으로 다 쓰는데, 닷넷은 32비트 400MB, 64비트 1GB가 되는 또라이같은 상황이 벌어짐.
미친... 400MB도 위험해. GC 적절하게 직접 안해주면 뻗엌ㅋㅋㅋㅋㅋㅋㅋㅋ