小编mch*_*chr的帖子

单个MSI安装正确的32或64位c#应用程序

我有一个C#应用程序,它是为x86(32位)和x64(64位)平台构建的.我的构建系统目前输出两个MSI安装程序,每个平台一个.如果它有所不同,我的C#应用​​程序包括一个Windows任务栏工具栏,这意味着必须由explorer.exe进程加载已安装的DLL.

是否可以生成单个MSI安装程序,它将根据当前操作系统是否为64位操作系统安装正确版本的应用程序?

目前,这已通过使用http://dotnetinstaller.codeplex.com/生成EXE来实现,该EXE执行体系结构检查,然后启动正确的MSI.但是,我更喜欢纯粹的基于MSI的方法.

c# windows windows-installer 32bit-64bit

11
推荐指数
2
解决办法
6644
查看次数

如何在我的SWT应用程序中检测ctrl-f

我编写了一个SWT UI,它具有在StyledText控件中显示文本的主要功能.我想为Ctrl+ 添加一个处理程序,F以便在按下该快捷键时将焦点设置为搜索框.我尝试使用以下代码来检测按键.

sWindow = new Shell();
...
sWindow.getDisplay().addFilter(SWT.KeyDown, new Listener()
{
  @Override
  public void handleEvent(Event e)
  {
    System.out.println("Filter-ctrl: " + SWT.CTRL);
    System.out.println("Filter-mask: " + e.stateMask);
    System.out.println("Filter-char: " + e.character);
  }
});
Run Code Online (Sandbox Code Playgroud)

我期待当我按下Ctrl+时f会看到以下输出:

Filter-ctrl: 262144
Filter-mask: 262144
Filter-char: f
Run Code Online (Sandbox Code Playgroud)

但是,在实践中我实际上看到以下内容.

Filter-ctrl: 262144
Filter-mask: 262144
Filter-char: <unprintable char - displayed as a box in eclipse console>
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  • Display.addFilter(...)是添加全局快捷方式的最佳方式吗?我尝试了Display.addListener(...),但这根本没有收到任何事件.
  • 当我按住时,为什么我不能得到压迫的角色Ctrl?当我按住alt或shift时,我得到预期的面具和按下的角色.

java swt keyboard-shortcuts event-handling

10
推荐指数
1
解决办法
2万
查看次数

什么时候收集烫发?

我在Tomcat应用程序上工作,该应用程序使用CMS收集器和内存条来触发GC.当我重新加载webapps时,我有时会遇到Old gen足以触发GC的情况,但死亡的类加载器不会被收集.

我读到类被分配到perm gen并且猜测它们因此被Old gen集合忽略.我写了下面的测试类来测试这个理论.

package test;

import java.io.IOException;
import java.io.InputStream;

import org.apache.commons.io.IOUtils;

/*
 JVM Options:
 -server -XX:+UseMembar -XX:+UseConcMarkSweepGC
 -XX:+UseParNewGC -XX:CMSInitiatingOccupancyFraction=80
 -XX:+UseCMSInitiatingOccupancyOnly -Xms100m -Xmx100m
 -XX:PermSize=100m -XX:NewSize=10m -XX:MaxNewSize=10m
 -verbose:gc -Xloggc:gc.log  -XX:+PrintGCTimeStamps
 -XX:+PrintGCDetails
 */
public class ClassLoaderTest extends ClassLoader
{
  @Override
  protected synchronized Class<?> loadClass(String xiName, boolean xiResolve)
      throws ClassNotFoundException
  {
    if (xiName.equals("test"))
    {
      // When asked to load "test", load Example.class
      Class<?> c = Example.class;
      String className = c.getName();
      String classAsPath = className.replace('.', '/') + ".class";
      InputStream stream = c.getClassLoader().getResourceAsStream(classAsPath);
      byte[] …
Run Code Online (Sandbox Code Playgroud)

java garbage-collection class permgen

9
推荐指数
1
解决办法
3665
查看次数

跟踪Java线程创建和生命周期

是否有任何工具可用于跟踪Java线程的创建和生命周期?我会对以下所有内容感兴趣:

  • 调用new Thread()的调用堆栈
  • 调用start()的调用堆栈
  • run()方法的生命周期

java multithreading

9
推荐指数
1
解决办法
3786
查看次数

AppEngine响应时间差异

我正在考虑使用AppEngine来部署我正在开发的webapp.作为我对AppEngine平台的调查的一部分,我一直在检查简单请求的响应时间.为此,我编写了一个简单的PING servlet:

@SuppressWarnings("serial")
public class Ping extends HttpServlet
{
  @Override
  public void doGet(@SuppressWarnings("unused") HttpServletRequest xiReq,
                    HttpServletResponse xiResp)
                    throws IOException
  {
    xiResp.setContentType("text/plain");
    xiResp.getWriter().println("PONG");
  }
}
Run Code Online (Sandbox Code Playgroud)

然后我编写了一个java程序,每秒向该servlet发出一个请求,并计算完成请求所需的时间.获取页面内容使用以下代码.

private static String getPageContent(String url) throws IOException {
  String result = null;
  URL reqURL = new URL(url);
  URLConnection connection = reqURL.openConnection();
  connection.setConnectTimeout(30 * 1000);
  connection.setReadTimeout(30 * 3000);
  InputStream webStream =  connection.getInputStream();
  BufferedReader reader = new BufferedReader(new InputStreamReader(webStream));
  result = reader.readLine();
  reader.close();
  return result;
}
Run Code Online (Sandbox Code Playgroud)

我的监视器脚本每隔3分钟以下列格式输出数据:

date,num_reqs,num_failedreqs,avg_reqtime,num_normreqs,avg_normreqtime,num_latereqs,avg_latereqtime
Run Code Online (Sandbox Code Playgroud)

normrequests是完成latereqs需要不到500ms的所有请求,所有请求需要超过500ms才能完成failreqs是在下载过程中抛出IO异常或者收到的内容不等于"PONG"的任何请求

我最后约20分钟的输出如下:

Thu Nov 25 10:04:01 GMT 2010,300,0,186,295,171,5,1093
Thu …
Run Code Online (Sandbox Code Playgroud)

java google-app-engine tomcat

8
推荐指数
1
解决办法
394
查看次数

Java线程转储摘要工具

我有时不得不从Tomcat服务器查看线程转储.但是,这是一个非常缓慢的过程,因为我的应用程序使用具有几百个线程的线程池.我看到的大多数线程转储包括许多线程的相同堆栈跟踪,因为它们空闲等待工作.

是否有任何工具可以解析线程转储,只显示唯一的堆栈跟踪以及每个状态中线程数的计数?这将允许我快速忽略在公共位置等待工作的数十或数百个线程.

我已经尝试过线程转储分析器,但这并没有对常见的堆栈跟踪进行任何总结.

java debugging stack-trace thread-dump

8
推荐指数
1
解决办法
2417
查看次数

JVM崩溃日志中的BufferBlob :: Interpreter是什么意思?

我正在研究在我的应用程序中偶尔发生的JVM崩溃.hs_err文件包含有关崩溃的以下详细信息.

#  SIGSEGV (0xb) at pc=0x065e68f4, pid=20208, tid=570166160
#
# Java VM: Java HotSpot(TM) Server VM (10.0-b23 mixed mode linux-x86)
Run Code Online (Sandbox Code Playgroud)

...

# Problematic frame:
# V  [libjvm.so+0x5e68f4]
Run Code Online (Sandbox Code Playgroud)

...

Current thread (0x099ea800):  JavaThread "Thread-315" daemon [_thread_in_vm, id=25782, stack(0x21fa3000,0x21fc1000)]
Run Code Online (Sandbox Code Playgroud)

...

vm_info: Java HotSpot(TM) Server VM (10.0-b23) for linux-x86 JRE (1.6.0_07-b06), built on Jun 10 2008 01:20:15 by "java_re" with gcc 3.2.1-7a (J2SE release)
Run Code Online (Sandbox Code Playgroud)

所以这告诉我JVM在运行一些Java代码时遇到了段错误.错误日志还包含有关崩溃的线程堆栈的信息.

Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
V  [libjvm.so+0x5e68f4]
V  [libjvm.so+0x1c054f]
V  [libjvm.so+0x1bfef2]
V  [libjvm.so+0x1bf57f] …
Run Code Online (Sandbox Code Playgroud)

java crash gdb jvm jvm-hotspot

7
推荐指数
1
解决办法
1597
查看次数

如何调查过多的java垃圾回收

我有一个Tomcat实例,它表现出以下行为:

  • 接受单个http传入请求.
  • 向后端服务器发出一个请求并返回大约400kb的XML.
  • 通过此XML并将其转换为大约400kb的JSON.
  • 返回JSON响应.

问题是,在处理400k请求的过程中,我的webapp会产生大约100mb的垃圾,这些垃圾填满了Eden空间并触发了年轻一代的收集.

我曾尝试使用内置的java hprof功能来进行分配站点分析,但Tomcat似乎没有正确启动它.有可能我只是有点不耐烦,因为我认为内存分配分析具有很高的开销,因此tomcat启动可能需要很长时间

用于对非常年轻的对象/垃圾进行java内存分析的最佳工具是什么?我不能使用堆转储,因为我感兴趣的对象是垃圾.

java tomcat

6
推荐指数
1
解决办法
1425
查看次数

如何使用用户权限而不是活动权限启动程序

我有一个C#应用程序,它运行并显示一个托盘图标.我有一个托盘应用程序的安装程序,它在安装后启动应用程序.安装程序需要管理员权限,而托盘图标必须以正常权限运行.我的安装程序目前打破了这个 - 当安装托盘应用程序启动时,它继承了安装程序进程的管理员权限.

作为我的安装程序的一部分,我正在启动一个C#应用程序来执行一些自定义工作.这个小应用程序目前通过调用以下方式启动托盘应用程

Process.Start(@"path/to/my/tray/app.exe"); 
Run Code Online (Sandbox Code Playgroud)

有没有办法使用当前用户的权限调用托盘应用程序,而不是提供给安装程序的提升权限?

我听说推荐的方法是在安装程序周围安装一个包装器EXE,启动安装程序,然后启动已安装的程序.如果可能的话,我想避免这种情况.

我正在使用WiX构建MSI安装程序,因此我也接受直接从WiX/MSI工作的解决方案.

c# permissions uac windows-7

6
推荐指数
1
解决办法
2733
查看次数

AppEngine记录限制

AppEngine应用程序日志是否有任何限制?谷歌存储无限量的日志数据吗?如果没有,存储了多少条目或多少天的数据?

单个日志的限制是什么?我试图制作一个非常大的日志,它被截断了.多余的数据是丢失还是只是隐藏在在线日志查看器中?

java logging google-app-engine

5
推荐指数
1
解决办法
358
查看次数