请原谅任何小的语法错误或诸如此类的错误,我正在通过Jitsi模块遇到这个问题并且不熟悉Java,想要确认发生了什么以及为什么以及如何修复它.
public abstract class A
{
public A()
{
this.load();
}
protected void load()
{
}
}
public class B extends A
{
private String testString = null;
public B()
{
super();
}
@Override
protected void load()
{
testString = "test";
}
}
Run Code Online (Sandbox Code Playgroud)
应用程序在使用按名称加载类方法创建类B的实例时执行此操作:
这是预期的Java行为吗?什么可能导致这个?它是在1.7 JDK上运行的Java 1.6应用程序.
所以我一直在尝试各种方法来批量获取事件日志数据(1000多条记录/秒).
我需要能够过滤旧日志的东西,现在我存储最后记录的事件记录ID并检索事件ID大于那个的所有记录....
我已经尝试过EventLogQuery/EventLogReader,这个工作很快,除非我想拉消息数据,为了获得安全日志的格式化消息,我需要调用EventLogRecord.FormattedMessage(),这使我的日志速度达到约150 /秒具有易于格式化的日志,更复杂的日志更糟糕.
我已经尝试过System.Diagnoistics.EventLog,这不允许我构建过滤器,所以每次运行它都必须加载所有事件日志,然后我可以解析任何重复项(从上次扫描).我有一个在过去两天内有200万个事件日志的服务器,由于这个内存使用情况变得很糟糕,所以这是不行的.
我已经尝试过使用System.Management.ManagementObjectCollection的WMI,它有过滤功能,可以从安全事件日志中快速提取消息数据(接近~1000 /秒),但是它会达到大约50/60k并开始拖动它的脚,做到大约1-2 /秒,最终我会得到一个配额违规错误.:(
所以要么:
有没有办法避免配额违规错误,或者我是否想使用其他方法以此速度提取事件日志?
编辑:
我写了一篇博文,详细介绍了我对此的了解:
http://www.roushtech.net/2013/10/30/high-performance-event-log-reading/
主要是:WINAPI是你最好的选择,要么写C++/CLR,要么使用PInvoke.
我有一个关于处理JNA下库引发异常的快速问题...
当我在底层本机代码中抛出异常时,JNA会收到无效的内存访问错误.我假设这是因为C库不能通过它的堆栈抛出异常(它实际上是C++/CLR但是有C输出)?那么有没有真正的方法来报告Java的异常?或"它应该工作",我只是做了一些令人难以置信的错误?
DllExport void Initialize(char* dir)
{
throw gcnew System::Exception("Testing");
}
Run Code Online (Sandbox Code Playgroud)
Java能够检测到这些抛出的异常会很好,我想我实际上可以考虑将内存指针传递给我的所有C导出并检查它们是否为null,但看起来像是一种迂回的方式.
我有一个构建服务器,可以在每个构建中提取nuget包,并且目前在内部部署了NugetGallery用于自定义包.现在,像没有明天一样吃带宽(不是很大,但我希望善待并为我们做得更快).
所以我想自动镜像repos并缓存它们.
到目前为止,我有几个选择:MyGet,这是一个仅限云的产品(所以没有),以及Proget(我倾向于).我还缺少自动镜像的其他选项吗?
一个相对简单的问题:
它似乎是C#不附带烤入恒定时间比较方法或扩展,为什么不呢?当然这是一个简单的算法,但它似乎应该包括在内.
通常不建议您编写任何自己的加密代码,但似乎没有任何库用于此类目的,我是否遗漏了一些?
因此,在登录/更改访问级别/等之后,我遇到了一个实现会话ID滚动的有趣问题.
在登录时我正在尝试使用SessionIDManager生成新的会话ID,但是这只会更改cookie标头,它不会在HttpContext中交换会话,因此我会向会话添加其他详细信息(各种详细信息)将用户绑定到会话ID),他们立即迷路(更不用说旧会话被遗弃).
为了防止会话劫持(通过存储主要的非SSL通信)和会话固定,我们应该在登录时生成新的会话ID,但Microsoft似乎不允许您这样做(grr,这么多的只读变量和没有构造函数的密封类).我可以只迁移后端SQL中的所有数据,但这似乎有点"肮脏的黑客".
关于如何正确地做到这一点的任何想法?
编辑:
我发现的实现:
Session.Abandon();
Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));
Run Code Online (Sandbox Code Playgroud)
会话仍然是旧会话,因此在下一页上,所有更改都将丢失.
SessionIDManager在SaveSessionID之后不返回会话对象,因此我无法向刚创建的会话添加详细信息.在下一页加载我可以,但旧会话现在无法访问(并放弃,但即使它没有被放弃...).
HttpContext.Session是只读的,即使它不是,HttpSessionState也没有构造函数.
编辑2:
显然会话固定和劫持在此之前已经被讨论过了,答案是"微软似乎并不关心",实施的两阶段修复效果不佳.
鉴于此C++代码:
void LoadData(char** myVar)
{
std:: string str("[Really Long String Here]");
unsigned int size = str.length() + 1;
*myVar = new char[size];
strncpy(*myVar, str.c_str(), size);
}
Run Code Online (Sandbox Code Playgroud)
而这个JNA Java:
Pointer myVar = new Memory(Pointer.SIZE);
this.Lib.LoadData(myVar);
this.someVar = myVar.getPointer(0).getString(0);
Run Code Online (Sandbox Code Playgroud)
我有内存泄漏,据我所知,getPointer(0)应该创建一个应该在finalize()上释放的指针对象,但它似乎不是.
我错过了什么吗?这似乎符合规范...我可以运行上面的函数,没有C++中的泄漏.
我在一个循环中调用Java代码来测试泄漏,我尝试了暂停,并手动调用GC,它也会以相当快的速度膨胀到千兆字节.
我已经对这个问题猛烈抨击了几天了,而且想要释放内存这么简单的东西很糟糕.据我所知,如果我有地址,我只能用Java手动释放内存. ,但我看不出我是怎么做到的.
编辑:
没关系,我甚至认为有一种方法可以手动免费通过JNA而不扩展它...
好吧,我一直在挖掘这一段时间,我正在寻找输入.
我需要一个可以加载和卸载本机库的Java应用程序,这很简单,C/C++/Java/Scripts/Executables /等.使用JNI和其他内置功能并不是真正的问题.
但是,我需要能够加载.NET库,这一直是疯狂的沮丧.我的第一个注意事项是使用JNI并调用C++包装器,如下所示:
Java的:
this.Lib = (LibHandler)Native.loadLibrary("MyLib", LibHandler.class);
Run Code Online (Sandbox Code Playgroud)
CPP:
#include <jni.h>
#using <MyLibCSharp.dll>
#include <vcclr.h>
#include <msclr\marshal.h>
using namespace msclr::interop;
using namespace System::Runtime::InteropServices;
using namespace System;
extern "C"
{
JNIEXPORT jstring JNICALL Java_Test(JNIEnv * env)
{
marshal_context ^ context = gcnew marshal_context();
const char* str4 = context->marshal_as<const char*>(CSharp::Class1::Test());
jstring js = env->NewStringUTF(str4);
return js;
}
JNIEXPORT jstring JNICALL Java_Test2(JNIEnv * env, jobject jobj)
{
marshal_context ^ context = gcnew marshal_context();
const char* str4 = context->marshal_as<const char*>(CSharp::Class1::Test());
jstring js = …
Run Code Online (Sandbox Code Playgroud) 我试图对我拥有的MVC站点进行单元测试时遇到了一些问题:我需要运行很多ASP.NET环境(生成httpcontexts,会话,cookie,成员资格等)才能完全测试一切.
即使要测试一些较少前端的东西需要会员资格才能正常工作,并且让这一切都被手工欺骗是很挑剔的.
有没有办法在NUnit测试中启动应用程序池?这似乎是最简单的方法.
我正在使用它们之间的本机库来做一些Java < - > .NET互操作代码,到目前为止事情进展顺利.
但由于某些原因,我无法在JNIEnv下运行任何方法.
System::String^ JNIStringToNet(JNIEnv * env, jstring js)
{
const char *buf = env->GetStringUTFChars(js, 0); // segfault
Run Code Online (Sandbox Code Playgroud)
现在我可以来回传递变量并进行所有其他类型的通信,所以我认为我没有正确地初始化这个或什么.
我正在加载它:
this.Lib = (LibHandler)Native.loadLibrary(this.Name, LibHandler.class);
Run Code Online (Sandbox Code Playgroud)
(我更喜欢Native.loadLibrary,因为它似乎让我可以更轻松地完成更多工作,例如多个库之间的类共享和取消并从动态JVM中取出它).
编辑:
严重的任何方法:
std::cout << "Getting version:" << std::endl;
std::cout << env->GetVersion() << std::endl;
Run Code Online (Sandbox Code Playgroud)
获取版本:
(段错误)
关于JNIEnv的任何想法会对每种方法都进行分段错误吗?这应该由JVM设置,对吗?
编辑2:
这是一个Java应用程序,它调用一个C++库,它将与.NET库接口(所以它是一个CLR编译的C++库,如果这有什么不同),限制任何我甚至不调用.NET DLL的外部因素但只是转换出来的字符串(或者很好......尝试).
例如来自Java:
this.Lib = (LibHandler)Native.loadLibrary(this.Name, LibHandler.class);
this.Lib.myCPPMethod(); // Segmentation fault during this call, JVM crashes.
Run Code Online (Sandbox Code Playgroud)
好奇,如果它是导致它的CLR:禁用clr编译并剥离CLR相关的所有内容,仍然这样做.
编辑3:
得到它转储:
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION …
Run Code Online (Sandbox Code Playgroud)