我有EJB的企业应用程序.该应用程序的总大小为34兆.当我部署我的应用程序时一切都很好但是当我重新部署它时,总加载类的数量增加.我正在使用visualVM查看此信息.它应该是它应该是什么,或者它是一个内存泄漏.如何解决这个问题呢?谢谢
我有一个Web应用程序和两个类文件,
第一类是MyClass.class,它位于abc.jar文件(WEB-INF/lib/abc.jar)中,第二类是YourClass.class,它位于classes文件夹(WEB-INF/classes/YourClass.class)中.
我的问题是,当应用程序启动时,哪个类会首先加载?为什么?
我写的过滤器抛出了ClassCastException
[Ljava.security.cert.X509Certificate; 无法转换为java.security.cert.X509Certificate
当我试图转换从ServletRequest属性中提取的Object时,即
public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain) throws
IOException, ServletException
{
X509Certificate cert = (X509Certificate) req.getAttribute("javax.servlet.request.X509Certificate");
System.out.println("cert dn " + cert.getSubjectDN().toString());
filterChain.doFilter(req, res);
}
Run Code Online (Sandbox Code Playgroud)
当我深入挖掘时,我理解像这样的异常很可能是由不同的类加载器引起的,尽管它们属于同一类类型.我该如何解决这个问题?
谢谢
我使用以下Spring 3配置来加载Jetty 7零碎
<bean class="org.eclipse.jetty.server.Server"
init-method="start" destroy-method="stop">
<property name="connectors">
<list>
<bean id="SSLConnector" class="org.eclipse.jetty.server.ssl.SslSocketConnector">
<property name="port" value="8553"/>
<property name="maxIdleTime" value="3600000"/>
<property name="soLingerTime" value="-1"/>
<property name="needClientAuth" value="true"/>
<property name="sslContext">
<ref bean="sslContext"/>
</property>
</bean>
</list>
</property>
<property name="handler">
<bean name="contexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection">
<property name="handlers">
<list>
<bean class="org.eclipse.jetty.servlet.ServletContextHandler">
<property name="contextPath">
<value>/caas</value>
</property>
<property name="resourceBase" …Run Code Online (Sandbox Code Playgroud) 我需要一个个人命令行工具,它应该将具体子类的名称作为CL参数,并在运行时实例化正确的Java类:
public class MyCommandLineTool
{
public static void main(String[] args)
{
// Read the name of the desired class to load
String strClassName = getClassNameFromArgs(args);
// Now create an instance of that class (if it exists/is valid/etc.)
Shape oShape = someMagicalClassLoaderCall(strClassName);
// Now call the subclass's overridden draw() method
oShape.draw();
}
}
public abstract class Shape
{
// Some stuff
public abstract void draw();
}
public class Circle extends Shape
{
@Override
public void draw()
{
// etc...
}
} …Run Code Online (Sandbox Code Playgroud) 我的webapp中有这样的文件结构:
webapp/
??? META-INF
??? WEB-INF
??? reports
? ??? info.txt
??? web.xml
3 directories, 2 files
Run Code Online (Sandbox Code Playgroud)
我需要/WEB-INF/reports/info.txt从这样的课程中获得:
this.getClass().getResource("/WEB-INF/reports/info.txt");
Run Code Online (Sandbox Code Playgroud)
这会解决吗?我将测试它,但我不确定Tomcat的类加载器如何解决问题.如果这不起作用,我该如何获取文件?
我知道生活在堆上的原始对象和对象,但是方法的数量如何影响对象的堆大小?
例如:
public class A {
int x;
public getX() { return x; }
}
public class B {
int x;
public getX() { return x; }
public getXString() { return String.valueOf(x); }
public doMoreInterestingStuff() { return x * 42; }
//etc
}
Run Code Online (Sandbox Code Playgroud)
实例化时,两个对象都在堆上,两者都有内存分配给它们的原语x,但由于有更多的方法签名,B分配了更多的堆空间?或者只是在permGen空间?在这个例子中它是微不足道的,但是当在任何给定时间内存在100,000多个这些对象时,我想它可能会加起来.
我使用了来自Maven repo的log4j-1.2.17软件包.我尝试在bundle中执行此代码(我的bundle调用log4j-1.2.17包)
PropertyConfigurator.configure(props());
private static Properties props() {
Properties props = new Properties();
props.put("log4j.rootLogger", "INFO, R");
props.put("log4j.appender.R",
"org.apache.log4j.DailyRollingFileAppender");
props.put("log4j.appender.R.File", "logs/IhtikaClient.log");
props.put("log4j.appender.R.Append", "true");
props.put("log4j.appender.R.Threshold", "INFO");
props.put("log4j.appender.R.DatePattern", "'.'yyyy-MM-dd");
props.put("log4j.appender.R.layout", "org.apache.log4j.PatternLayout");
props.put("log4j.appender.R.layout.ConversionPattern",
//"%d{HH:mm:ss,SSS} %c - %m%n");
//"[%5p] %d{yyyy-MM-dd mm:ss} (%F:%M:%L)%n%m%n%n");
"[%5p] %d{yyyy-MM-dd mm:ss} %c (%F:%M:%L)%n%m%n");
return props;
}
Run Code Online (Sandbox Code Playgroud)
但我有错误
log4j:ERROR A "org.apache.log4j.DailyRollingFileAppender" object is not assignable to a "org.apache.log4j.Appender" variable.
log4j:ERROR The class "org.apache.log4j.Appender" was loaded by
log4j:ERROR [org.apache.felix.framework.BundleWiringImpl@9da1dd] whereas object of type
log4j:ERROR "org.apache.log4j.DailyRollingFileAppender" was loaded by [sun.misc.Launcher$AppClassLoader@4b222f].
log4j:ERROR Could not instantiate …
由于某些原因,我需要在我的项目中使用包的长名称.喜欢:
com.example.foo.bar.bazz.anotherlongsubpart.andfinallytheactualpackagname
Run Code Online (Sandbox Code Playgroud)
因此,考虑到名称约定(至少我所知道的Java中的名称约定),我必须创建适当的目录结构,用斜杠替换点:
com/example/foo/bar/bazz/anotherlongsubpart/andfinallytheactualpackagname
Run Code Online (Sandbox Code Playgroud)
至于我,它看起来太丑了:)所以我尝试用斜线替换只有点的部分:
com.example.foo.bar.bazz.anotherlongsubpart/andfinallytheactualpackagname
Run Code Online (Sandbox Code Playgroud)
换句话说,我在这里有一个包名为"com.example.foo.bar.bazz.anotherlongsubpart"的包/目录,另一个包含"andfinallytheactualpackagname".这样做是否合法?我尝试使用Simple Build Tool编译所有这些东西,并在其上运行我的单元测试.它运作良好.正如我用普通的方式用斜线命名.
因此,我的实验表明它至少与SBT一起运作良好.但我不确定这种做法是否会导致进一步的问题?也许在不同类型的类加载器等不同的环境中?
我有一个使用静态方法来包装远程API调用的类.
一般来说,我不希望我的API服务器一直"监听"这些调用,而只是在程序使用该类时才监听.所以我需要一种方法告诉服务器在类加载时"唤醒"(我发送"唤醒"消息的方式是无关紧要的).
我知道我可以在调用第一个类方法时唤醒服务器,但是我希望它在类加载到正在运行的程序后立即就绪(即使它是懒惰加载的).
此外,知道何时不再使用该类会很好,所以我可以告诉服务器重新入睡.
基本上,我正在寻找整个班级的"构造者"和"终结者".可以这样做吗?
编辑:我忘了提到一个非常重要的事情,我不能让用户使用公共静态方法或类似的东西手动初始化/完成类.这堂课需要像普通的本地班级一样.
在Struts1中,我听说有一个由CVE-2014-0114引起的类加载器漏洞问题.但是我无法在我的项目中重现这一点.任何人都可以帮助我如何重现这个问题.我用Google搜索但没有得到任何复制程序.
我使用struts-1.1,Jboss -4.2.3.GA,Apache 2.2.0,MySql 5.0.37, JKMod, JDK 1.6.0_12, Ant 1.7.0我的web项目.