我有一个C#应用程序,它是为x86(32位)和x64(64位)平台构建的.我的构建系统目前输出两个MSI安装程序,每个平台一个.如果它有所不同,我的C#应用程序包括一个Windows任务栏工具栏,这意味着必须由explorer.exe进程加载已安装的DLL.
是否可以生成单个MSI安装程序,它将根据当前操作系统是否为64位操作系统安装正确版本的应用程序?
目前,这已通过使用http://dotnetinstaller.codeplex.com/生成EXE来实现,该EXE执行体系结构检查,然后启动正确的MSI.但是,我更喜欢纯粹的基于MSI的方法.
我编写了一个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)
我有两个问题:
我在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线程的创建和生命周期?我会对以下所有内容感兴趣:
我正在考虑使用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) 我有时不得不从Tomcat服务器查看线程转储.但是,这是一个非常缓慢的过程,因为我的应用程序使用具有几百个线程的线程池.我看到的大多数线程转储包括许多线程的相同堆栈跟踪,因为它们空闲等待工作.
是否有任何工具可以解析线程转储,只显示唯一的堆栈跟踪以及每个状态中线程数的计数?这将允许我快速忽略在公共位置等待工作的数十或数百个线程.
我已经尝试过线程转储分析器,但这并没有对常见的堆栈跟踪进行任何总结.
我正在研究在我的应用程序中偶尔发生的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) 我有一个Tomcat实例,它表现出以下行为:
问题是,在处理400k请求的过程中,我的webapp会产生大约100mb的垃圾,这些垃圾填满了Eden空间并触发了年轻一代的收集.
我曾尝试使用内置的java hprof功能来进行分配站点分析,但Tomcat似乎没有正确启动它.有可能我只是有点不耐烦,因为我认为内存分配分析具有很高的开销,因此tomcat启动可能需要很长时间
用于对非常年轻的对象/垃圾进行java内存分析的最佳工具是什么?我不能使用堆转储,因为我感兴趣的对象是垃圾.
我有一个C#应用程序,它运行并显示一个托盘图标.我有一个托盘应用程序的安装程序,它在安装后启动应用程序.安装程序需要管理员权限,而托盘图标必须以正常权限运行.我的安装程序目前打破了这个 - 当安装托盘应用程序启动时,它继承了安装程序进程的管理员权限.
作为我的安装程序的一部分,我正在启动一个C#应用程序来执行一些自定义工作.这个小应用程序目前通过调用以下方式启动托盘应用程
Process.Start(@"path/to/my/tray/app.exe");
Run Code Online (Sandbox Code Playgroud)
有没有办法使用当前用户的权限调用托盘应用程序,而不是提供给安装程序的提升权限?
我听说推荐的方法是在安装程序周围安装一个包装器EXE,启动安装程序,然后启动已安装的程序.如果可能的话,我想避免这种情况.
我正在使用WiX构建MSI安装程序,因此我也接受直接从WiX/MSI工作的解决方案.
AppEngine应用程序日志是否有任何限制?谷歌存储无限量的日志数据吗?如果没有,存储了多少条目或多少天的数据?
单个日志的限制是什么?我试图制作一个非常大的日志,它被截断了.多余的数据是丢失还是只是隐藏在在线日志查看器中?
java ×8
c# ×2
tomcat ×2
32bit-64bit ×1
class ×1
crash ×1
debugging ×1
gdb ×1
jvm ×1
jvm-hotspot ×1
logging ×1
permgen ×1
permissions ×1
stack-trace ×1
swt ×1
thread-dump ×1
uac ×1
windows ×1
windows-7 ×1