小编Lap*_*son的帖子

分发Java应用程序的最佳方式是什么?

Java是我选择的编程语言之一.尽管将我的应用程序分发给最终用户,但我总是遇到这个问题.

为用户提供JAR并不总是像我希望的那样友好,并且使用Java WebStart要求我维护一个Web服务器.

分发Java应用程序的最佳方法是什么?如果Java应用程序需要将工件安装到用户的计算机,该怎么办?那里有没有好的Java安装/包装系统?

java installer software-distribution jar

113
推荐指数
3
解决办法
6万
查看次数

使用Java的"始终在顶级"Windows

在Java中,有没有办法让一个窗口"永远在顶部",无论用户是否将焦点切换到另一个应用程序?我搜索过网络,所有解决方案都倾向于使用本机绑定的某种JNI接口.真的,这不是唯一的方法吗?..或者是吗?

java user-interface swing awt

85
推荐指数
2
解决办法
8万
查看次数

备用Java选择器实现

我正在编写一个具有网络组件的高性能/低垃圾应用程序(微秒级).我遇到的一个痛点是内置的Selector Selector for Java NIO的实现.

一些有问题的事情:

  • 大量的对象创建.几乎每次调用selectedKeys()都会创建很多对象.迭代器,装箱/拆箱,你的名字.大多数其他情况不是问题,但我正在编写的应用程序需要创建尽可能少的垃圾.
  • 分层锁定和同步.在构建selectorImpls时,一堆Java锁原语不存在.结果它很笨重而且不是最佳的.在我的用例中,只有一个线程调用,select因此锁定实际上是无用的.

扩展或更改选择器实现是不可能的.大多数类都是最终的,私有和包私有成员位于sun.nio.ch.*包中.原生方法也使事情变得复杂.

是否还有其他更现代的选择器实现可能更高效?

我检查过的网络库只是使用了内置的Java选择器.任何帮助,将不胜感激.

java java-native-interface nio

14
推荐指数
1
解决办法
698
查看次数

writeDelimitedTo/parseDelimitedFrom 似乎正在丢失数据

我正在尝试使用协议缓冲区来记录一些市场数据。每次我从市场收到报价通知时,我都会获取该报价并将其转换为协议缓冲区对象。然后我调用“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 ?

谢谢!

java protocol-buffers

4
推荐指数
1
解决办法
5143
查看次数

从JVM内部修改JVM args

有没有办法从jvm里面修改jvm args?具体来说,我希望能够从内部更改jvm的最大堆大小.这可能吗?

编辑:我想我应该添加我想要这样做的原因.我有一些在不同的机器/平台上运行的Java程序.这些程序具有在运行时获取的配置,并且根据程序运行的计算机/环境而不同.其中一些配置可以在运行时更改,并且各种程序会随着配置的更改自动更新.

我希望堆大小成为这些配置参数之一,这些参数在运行时来源,就像配置的其余部分一样.如果是这样,那么程序可以启动(使用一些默认的jvm args)然后根据检索到的配置调整自身.

java jvm vmargs

3
推荐指数
1
解决办法
2545
查看次数