我正在研究的C#/ .NET应用程序正在遭受缓慢的内存泄漏.我已经使用CDB和SOS来尝试确定发生了什么,但数据似乎没有任何意义,所以我希望你们中的一个人之前可能已经经历过这种情况.
该应用程序在64位框架上运行.它不断地计算并将数据序列化到远程主机,并且正在大量地击中大对象堆(LOH).但是,我希望大多数LOH对象都是瞬态的:一旦计算完成并且已经发送到远程主机,就应该释放内存.然而,我所看到的是大量(实时)对象数组与空闲的内存块交织,例如,从LOH中获取一个随机段:
0:000> !DumpHeap 000000005b5b1000 000000006351da10
Address MT Size
...
000000005d4f92e0 0000064280c7c970 16147872
000000005e45f880 00000000001661d0 1901752 Free
000000005e62fd38 00000642788d8ba8 1056 <--
000000005e630158 00000000001661d0 5988848 Free
000000005ebe6348 00000642788d8ba8 1056
000000005ebe6768 00000000001661d0 6481336 Free
000000005f214d20 00000642788d8ba8 1056
000000005f215140 00000000001661d0 7346016 Free
000000005f9168a0 00000642788d8ba8 1056
000000005f916cc0 00000000001661d0 7611648 Free
00000000600591c0 00000642788d8ba8 1056
00000000600595e0 00000000001661d0 264808 Free
...
Run Code Online (Sandbox Code Playgroud)
显然,如果我的应用程序在每次计算期间创建长寿命的大对象,我会期望这种情况.(它确实这样做,我接受会有一定程度的LOH碎片,但这不是问题.)问题是你可以在上面的转储中看到的非常小的(1056字节)对象数组,我在代码中看不到正在创建,并以某种方式保持根深蒂固.
另请注意,转储堆段时CDB不报告类型:我不确定这是否相关.如果我转储标记的(< - )对象,CDB/SOS报告正常:
0:015> !DumpObj 000000005e62fd38
Name: System.Object[]
MethodTable: 00000642788d8ba8
EEClass: 00000642789d7660
Size: 1056(0x420) bytes
Array: Rank 1, Number of elements 128, Type CLASS …
Run Code Online (Sandbox Code Playgroud) 以下是获取正在运行的用户主目录的最佳方法吗?或者我有一个特定的功能吗?
os.Getenv("HOME")
Run Code Online (Sandbox Code Playgroud)
如果以上是正确的,那么是否有人知道这种方法是否可以保证在非Linux平台上运行,例如Windows?
我编写了一个使用子命令的命令行工具,就像Mercurial,Git,Subversion&c.一样,它的一般用法是:
>myapp [OPTS] SUBCOMMAND [SUBCOMMAND-OPTS] [ARGS]
Run Code Online (Sandbox Code Playgroud)
例如
>myapp --verbose speak --voice=samantha --quickly "hello there"
Run Code Online (Sandbox Code Playgroud)
我现在正在为它建立Zsh完成,但很快发现它是一个非常复杂的野兽.我已经看过了_hg
和_git
完成但是它们非常复杂并且在方法上有所不同(我很难理解它们),但两者似乎分别处理每个子命令.
有谁知道,如果有使用内置函数的方式(_arguments
,_values
,pick_variant
&C)正确处理子命令的概念,包括妥善处理常规选项和子命令特定的选项?或者最好的方法是手动处理一般选项和子命令?
一个非常好的例子将非常感激.
非常感谢.
我正在使用的包gosqlite有一个带有可变参数的方法,其中的类型是空接口.
func (s *Stmt) Exec(args ...interface{}) os.Error
Run Code Online (Sandbox Code Playgroud)
如果明确传递单个参数,我可以调用它:
statement := blah()
error := statement.Exec("hello", 3.0, true) // works fine
Run Code Online (Sandbox Code Playgroud)
但是,由于variadic参数对应于in
我的SQL语句的运算符中的占位符select
,因此这些占位符的数量在编译时是未知的,但在运行时会根据用户的操作而动态更改.例如,如果用户输入四个值,我最终会得到类似于以下内容的SQL:
SELECT * FROM sky WHERE name IN (?,?,?,?)
Run Code Online (Sandbox Code Playgroud)
所以我很自然地想Exec
用一段字符串调用该方法:
var values []string = getValuesFromUser()
statement := createStatementWithSufficientNumberOfPlaceholders(len(values))
_ := statement.Exec(values...) // compiler doesn't like this
Run Code Online (Sandbox Code Playgroud)
这不编译.我可以通过创建一个空的接口切片并复制引用来解决这个问题:
values2 := make([]interface{}, len(values))
for index, value := range values { values2[index] = value }
_ := statement.Exec(values2...) // compiler happy but I'm not …
Run Code Online (Sandbox Code Playgroud) 我正在使用Castle DynamicProxy编写装饰代理.我需要代理的拦截器来拦截属性写入(而不是读取)所以我正在检查方法的名称:
public void Intercept(IInvocation invocation)
{
if (invocation.Method.Name.StartsWith("set_")
{
// ...
}
invocation.Proceed();
}
Run Code Online (Sandbox Code Playgroud)
现在这个工作正常,但我不喜欢我的代理人对如何实现属性有深入了解的事实:我想用类似于以下内容的方法替换方法名称检查:
if (invocation.Method.IsPropertySetAccessor)
Run Code Online (Sandbox Code Playgroud)
不幸的是,我的Google-fu失败了.有任何想法吗?
Scala语言规范版本2.8的4.6.2节描述了重复的参数,并说:
参数部分的最后一个值参数可以以"*"为后缀,例如(...,x:T*).然后,方法中的这种重复参数的类型是序列类型scala.Seq [T].
但是,这段代码:
abstract class A { def aSeq : Seq[A] }
class B(val aSeq : A*) extends A
class C extends B { override val aSeq :Seq[A] = Seq() }
Run Code Online (Sandbox Code Playgroud)
编译时出错:
overriding value aSeq in class B of type A*; value aSeq has incompatible type
Run Code Online (Sandbox Code Playgroud)
编译器似乎表明A*是与Seq [A]不同的类型.
在这种情况下调查aSeq的实际类显示它是scala.collection.mutable.WrappedArray $ ofRef的实例,但即使以下代码也无法使用相同的消息进行编译:
class C extends B { override val aSeq = new ofRef(Array[A]()) }
Run Code Online (Sandbox Code Playgroud)
所以问题是,如何覆盖由类上重复参数定义的成员?
如果你想知道它来自何处,那就是exalaly scala.xml.Elem 在scala.xml.Node中覆盖子方法的作用.
我在Visual Studio中构建了一个程序.该程序创建一个日志文件,并在程序运行时写入.因此,我构建了一个安装程序(setup-project),它应该为我的程序文件夹设置写权限,无论哪个用户使用该程序.目前它看起来像这样:
// ...
}
InitializeComponent();
string folder = Directory.GetCurrentDirectory();
DirectorySecurity ds = Directory.GetAccessControl(folder);
ds.AddAccessRule(new FileSystemAccessRule("Everyone", //Everyone is important
//because rights for all users!
FileSystemRights.Read | FileSystemRights.Write, AccessControlType.Allow));
}
// ...
Run Code Online (Sandbox Code Playgroud)
在最后两行中,我得到了一个System.SystemException
:"Die Vertrauensstellung zwischenderprimärenDomäneunddervertrauenswürdigenDomänekonntenicht hergestellt werden."
[翻译:"无法建立主域和可信域之间的信任关系."]
堆栈跟踪如下所示:
bei System.Security.Principal.NTAccount.TranslateToSids(IdentityReferenceCollection sourceAccounts, Boolean& someFailed)
bei System.Security.Principal.NTAccount.Translate(IdentityReferenceCollection sourceAccounts, Type targetType, Boolean& someFailed)
bei System.Security.Principal.NTAccount.Translate(IdentityReferenceCollection sourceAccounts, Type targetType, Boolean forceSuccess)
bei System.Security.Principal.NTAccount.Translate(Type targetType)
bei System.Security.AccessControl.CommonObjectSecurity.ModifyAccess(AccessControlModification modification, AccessRule rule, Boolean& modified)
bei System.Security.AccessControl.CommonObjectSecurity.AddAccessRule(AccessRule rule)
bei System.Security.AccessControl.FileSystemSecurity.AddAccessRule(FileSystemAccessRule rule)
Run Code Online (Sandbox Code Playgroud)
你知道我能做什么吗?谢谢
我试图修复一种方法,检查用户是否在他的计算机上安装了Skype.这个我修复/提出:
有没有人对如何检查计算机上是否安装了Skype有任何想法?
我使用的方法是这个方法的simillrar:
我编写了一个应用程序,其中我正在使用文件处理程序下载电子邮件并在名为my.log的文件中记录详细信息.
FileHandler handler = new FileHandler("my.log",5242880,1,true); loggerObject.addHandler(处理程序);
虽然正确地进行了日志记录,但是在同一目录中正在生成多个文件,如my.log.1,my.log.2等.它们不是临时的,即使在程序停止执行后也会保留在那里.
为什么要生成它们?如何防止这种情况发生?
我正在尝试旋转Vector2但没有任何效果.
我试过以下 - >没有用:
x' = cos(angle)*x - sin(angle)*y & y' = sin(angle)*x + cos(angle)*y
Run Code Online (Sandbox Code Playgroud)
我尝试过使用旋转矩阵 - >没用
我究竟做错了什么 ?:/
angle = MathHelper.Pi;
direction.X = (int)((direction.X) * Math.Cos(angle) - direction.Y * Math.Sin(angle));
direction.Y = (int)((direction.X) * Math.Sin(angle) + direction.Y * Math.Cos(angle));
float angle = MathHelper.PiOver2;
Vector2 dir = new Vector2(direction.X, direction.Y);
Vector2.Transform(dir, Matrix.CreateRotationX(angle));
direction = new Point((int)dir.X, (int)dir.Y);
Run Code Online (Sandbox Code Playgroud) c# ×5
.net ×3
go ×2
java ×1
logging ×1
memory-leaks ×1
permissions ×1
reflection ×1
scala ×1
skype ×1
windbg ×1
windows-xp ×1
xna ×1
zsh ×1