我有一个.NET应用程序,我已移植到.NET Core.我在Ubuntu 14.04上测试它.
我试图弄清楚如何在程序崩溃时获取.dmp文件或Linux等效文件.我打电话,Environment.FailFast但据我所知,这不会像在Windows上那样生成.dmp文件.根据这种情况 Environment.FailFast应该创建一个转储,但如果它是我找不到它.
另外我尝试使用手动创建转储gcore.这可行但是生成转储需要很长时间(我的应用程序不是那么大)并且我无法在gdb之后获得正确的callstacks,因为当我将gdb指向我的应用程序时它无法识别它.
在Linux上获取.NET Core应用程序转储的最佳方法是什么?
谢谢!
我想知道当没有IO线程来处理异步调用的结果时会发生什么.
假设您发出异步Web请求(在服务器应用程序中,因此所有异步代码都由线程池管理).OS会在有结果时发出信号,当它出现时,你需要一个IO线程来读取套接字中的字节.如果没有可用的IO线程,因为它们都在使用中(所有意味着最多由线程池设置的最大值)会发生什么?是否有一个队列,信号可以等到有线程可用?或者信号是否闻所未闻?如果后者发生,等待等待的代码会发生什么?
我试图使用HTTP从一台服务器下载一个大文件(> 1GB).为此,我将并行处理HTTP范围请求.这让我可以并行下载文件.
保存到磁盘时,我正在接收每个响应流,打开与文件流相同的文件,寻找我想要的范围然后写入.
但是我发现除了我的一个响应流之外的所有响应都会超时.它看起来像磁盘I/O无法与网络I/O跟上.但是,如果我做同样的事情,但让每个线程写入一个单独的文件,它工作正常.
作为参考,这是我写入同一文件的代码:
int numberOfStreams = 4;
List<Tuple<int, int>> ranges = new List<Tuple<int, int>>();
string fileName = @"C:\MyCoolFile.txt";
//List populated here
Parallel.For(0, numberOfStreams, (index, state) =>
{
try
{
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("Some URL");
using(Stream responseStream = webRequest.GetResponse().GetResponseStream())
{
using (FileStream fileStream = File.Open(fileName, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write))
{
fileStream.Seek(ranges[index].Item1, SeekOrigin.Begin);
byte[] buffer = new byte[64 * 1024];
int bytesRead;
while ((bytesRead = responseStream.Read(buffer, 0, buffer.Length)) > 0)
{
if (state.IsStopped)
{
return; …Run Code Online (Sandbox Code Playgroud) 我正在运行一个服务HTTP请求的C#应用程序。我最近注意到,它占用的内存比我预期的要多。我抓起一些转储,将它们弹出到Windbg中,发现大部分内存都标记为“空闲”:
!dumpheap -stat
...
00007ffde4783630 681599 65433504 System.Threading.Tasks.TaskFactory+CompleteOnInvokePromise
00007ffde47cc988 167885 76872908 System.Byte[]
00007ffde47c6948 521353 80352802 System.String
0000007e3a16c2d0 1870425 1415374334 Free
Run Code Online (Sandbox Code Playgroud)
因此,转储约为3GB,因此其中约有一半是可用内存。看着堆,我看到了:
!heapstat
Heap Gen0 Gen1 Gen2 LOH
Heap0 82248472 7354560 987275056 178834656
Heap1 93146552 6382864 857470096 129435960
Total 175395024 13737424 1844745152 308270616
Free space: Percentage
Heap0 40969256 146456 640426720 54829792 SOH: 63% LOH: 30%
Heap1 75943736 94448 550812312 54825216 SOH: 65% LOH: 42%
Total 116912992 240904 1191239032 109655008
Run Code Online (Sandbox Code Playgroud)
因此,我的小对象堆非常分散,特别是Gen2。在服务器上,我可以看到gen2集合正在发生(使用性能计数器),但是即使它们是gen2堆,也似乎没有对其进行压缩。即使服务器上只有1-2%的RAM可用,gen2堆也不会被压缩。
在我看来,由于堆是零散的,所以我正遭受这种内存压力。但是我无法弄清楚为什么会发生碎片或为什么gen2无法压缩。一些可用空间的大小为6MB,所以我认为肯定可以将那些空间压缩掉。
谁能给我一些关于如何弄清楚我的堆为什么如此分散的想法?我什至在这里吠叫正确的树吗?
任何帮助将不胜感激,谢谢!
编辑1:
的细分!gchandles为:
Handles:
Strong Handles: 4507 …Run Code Online (Sandbox Code Playgroud) .net c# garbage-collection heap-fragmentation memory-fragmentation
我有一个名为snake.html的html文件,我想把它放在一个罐子里.运行jar时,主类应该在浏览器中打开这个html文件.我试过了:
public static void main(String[] args) throws IOException, URISyntaxException {
URL url = Snake.class.getResource("/WebContent/snake.html");
System.out.println(url);
// relative to the class location
Desktop.getDesktop().browse(url.toURI());
}
Run Code Online (Sandbox Code Playgroud)
如果我只是运行这段代码但是当我把它(和html文件)运行时,我会得到以下异常:
Exception in thread "main" java.io.IOException: Failed to mail or browse
jar:file:/Users/~user~/Desktop/Snake%20v0.1.jar!/WebContent/snake.html.
Error code: -10814
at apple.awt.CDesktopPeer.lsOpen(CDesktopPeer.java:52)
at apple.awt.CDesktopPeer.browse(CDesktopPeer.java:45)
at java.awt.Desktop.browse(Desktop.java:368)
at snake.Snake.main(Snake.java:26)
Run Code Online (Sandbox Code Playgroud)
我想知道我是否有类路径问题或者我没有正确地将jar指向文件.这个jar有两个目录,snake和WebContent.Snake有snake.class文件,WebContent有snake.html.
任何和所有帮助/批评赞赏.