Java是我选择的编程语言之一.尽管将我的应用程序分发给最终用户,但我总是遇到这个问题.
为用户提供JAR并不总是像我希望的那样友好,并且使用Java WebStart要求我维护一个Web服务器.
分发Java应用程序的最佳方法是什么?如果Java应用程序需要将工件安装到用户的计算机,该怎么办?那里有没有好的Java安装/包装系统?
在Java中,有没有办法让一个窗口"永远在顶部",无论用户是否将焦点切换到另一个应用程序?我搜索过网络,所有解决方案都倾向于使用本机绑定的某种JNI接口.真的,这不是唯一的方法吗?..或者是吗?
我正在编写一个具有网络组件的高性能/低垃圾应用程序(微秒级).我遇到的一个痛点是内置的Selector Selector for Java NIO的实现.
一些有问题的事情:
select
因此锁定实际上是无用的.扩展或更改选择器实现是不可能的.大多数类都是最终的,私有和包私有成员位于sun.nio.ch.*
包中.原生方法也使事情变得复杂.
是否还有其他更现代的选择器实现可能更高效?
我检查过的网络库只是使用了内置的Java选择器.任何帮助,将不胜感激.
我正在尝试使用协议缓冲区来记录一些市场数据。每次我从市场收到报价通知时,我都会获取该报价并将其转换为协议缓冲区对象。然后我调用“writeDelimitedTo”
我的录音机示例:
try {
writeLock.lock();
LimitOrder serializableQuote = ...
LimitOrderTransport gpbQuoteRaw = serializableQuote.serialize();
LimitOrderTransport gpbQuote = LimitOrderTransport.newBuilder(gpbQuoteRaw).build();
gpbQuote.writeDelimitedTo(fileStream);
csvWriter1.println(gpbQuote.getIdNumber() + DELIMITER+ gpbQuote.getSymbol() + ...);
} finally {
writeLock.unlock();
}
Run Code Online (Sandbox Code Playgroud)
锁定的原因是因为来自不同市场的报价由不同的线程处理,所以我试图简化并将日志记录“序列化”到文件中。
读取结果文件的代码:
FileInputStream stream = new FileInputStream(pathToFile);
PrintWriter writer = new PrintWriter("quoteStream6-compare.csv", "UTF-8");
while(LimitOrderTransport.newBuilder().mergeDelimitedFrom(stream)) {
LimitOrderTransport gpbQuote= LimitOrderTransport.parseDelimitedFrom(stream);
csvWriter2.println(gpbQuote.getIdNumber()+DELIMITER+ gpbQuote.getSymbol() ...);
}
Run Code Online (Sandbox Code Playgroud)
当我运行记录器时,我得到一个似乎在增大的二进制文件。当我使用阅读器阅读文件时,我似乎也得到了大量的引用。它们都是不同的并且看起来都是正确的。
问题是:许多引用似乎“丢失” - 当我的读者从文件中读取时不存在。
我尝试使用 csvWriter1 和 csvWriter2 进行实验。在我的编写器中,我写出一个 csv 文件,然后在我的阅读器中,我使用 protobufs 文件作为源编写第二个 cvs 文件。
理论上来说,它们应该匹配。他们不匹配。原始 csv 文件包含的引号比我通过读取 protobufs 记录数据生成的 csv 更多。
是什么赋予了?我是否没有正确使用 writeDelimitedTo/parseDelimitedFrom ?
谢谢!
有没有办法从jvm里面修改jvm args?具体来说,我希望能够从内部更改jvm的最大堆大小.这可能吗?
编辑:我想我应该添加我想要这样做的原因.我有一些在不同的机器/平台上运行的Java程序.这些程序具有在运行时获取的配置,并且根据程序运行的计算机/环境而不同.其中一些配置可以在运行时更改,并且各种程序会随着配置的更改自动更新.
我希望堆大小成为这些配置参数之一,这些参数在运行时来源,就像配置的其余部分一样.如果是这样,那么程序可以启动(使用一些默认的jvm args)然后根据检索到的配置调整自身.