问题标签 [glassfish-2.x]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
4337 浏览

java - 类加载器不会被垃圾回收,即使没有 GC 根

我们有一个在 Glassfish V2.1.1 下运行的复杂应用程序。为了能够动态加载我们的代码,我们实现了一个能够重新定义类的 CustomClassloader。行为非常简单:当动态加载的类发生变化时,CustomClassloader 的当前实例被“删除”并创建一个新实例以重新定义所需的类。

这很好用,除了在重新加载同一个类几次之后(因此每次创建新的 CustomClassloader 时),我们都会收到 PermGen 空间错误,因为 CustomClassloader 的其他实例没有被垃圾收集。(这个类应该只有一个实例)

我尝试了不同的方法来追踪泄漏的位置:

  1. visualvm => 我做了一个堆转储并提取 CustomClassloader 的所有实例。我可以看到它们都没有最终确定。当我检查最近的 GC 根时,visualvm 告诉我没有(最后一个实例除外,因为它是“真正的”使用过的)。
  2. jmap/jhat => 它给了我几乎相同的结果:我看到了 CustomClassloader 的所有实例,然后当我单击链接以查看其中一个的引用在哪里时,我得到一个空白页,这意味着没有.. .
  3. Eclipse Memory Analyzer Tool => 当我运行以下 OQL 查询时得到一个奇怪的结果: SELECT c FROM INSTANCEOF my.package.CustomClassloader c 只有一个结果,表明只有一个实例,这显然是正确的。

我还检查了此链接并在创建新的 CustomClassloader 时实现了一些资源释放,但没有任何变化:PermGen 内存仍在增加。

所以我可能遗漏了一些东西,点 (1-2) 和 (3) 之间的区别显示了我不明白的东西。我在哪里可以了解问题所在?由于我遵循的所有教程都显示了如何使用“搜索最近的 GC 根”功能来搜索泄漏的引用(在我的情况下没有),我不知道如何跟踪错误。

编辑 1:我在这里上传了一个堆转储示例。可以使用以下查询在 visualvm 中选择未卸载的 ClassLoader:select s from saierp.core.framework.system.SAITaskClassLoader s 可以看到有 4 个实例,并且应该收集前三个实例,因为没有 GC 根... 某处必须有引用,但我没有不知道如何搜索它。欢迎任何提示:)

编辑 2:经过一些更深入的测试后,我看到了一个非常奇怪的模式。泄漏似乎取决于 OpenJPA 正在加载的数据:如果没有加载新数据,则可以对类加载器进行 GC,否则不会。这是我在创建新的 SAITaskClassLoader 以“清除”旧的时使用的代码:

= 模式 1(类加载器是 GCed): =

  1. 新的 SAITaskClassLoader
  2. 加载数据 D1, D2, ..., Dn
  3. 新的 SAITaskClassLoader
  4. 加载数据 D1, D2, ..., Dn
  5. ...

cl-gc

= 模式 2(类加载器未经过 GC):=

  1. 新的 SAITaskClassLoader
  2. 加载数据 D1、D2、D3
  3. 新的 SAITaskClassLoader
  4. 加载数据 D3、D4、D5
  5. 新的 SAITaskClassLoader
  6. 加载数据 D5、D6、D7
  7. ...

cl-nogc

在所有情况下,已清除的 SAITaskClassLoader 都没有 GC 根。我们使用的是 OpenJPA 1.2.1。

谢谢和最好的问候

0 投票
0 回答
930 浏览

memory-leaks - 自定义 ClassLoader 没有被垃圾收集

为了解决这个问题,我构建了一个(非常)小的项目来复制它的一部分。这是一个使用 Glassfish v2.1.1 和 OpenJpa-1.2.2 的 NetBeans 项目。

在全球范围内,目标是能够动态地重新加载一些业务代码(称为“任务”),而无需(重新)进行完整部署(例如通过 asadmin)。在项目中有两个:PersonTask 和 AddressTask,它们只是简单地访问一些数据并将它们打印出来。

为了做到这一点,我实现了一个自定义类加载器,它读取类文件的二进制文件并通过defineClass方法注入它。基本上,这个 CustomClassLoader 是一个单例,实现如下:

在我的 EJB 外观 (EntryPointBean) 中,我只需查找类,创建它的新实例并调用它的process方法。项目中的代码略有不同,但思路大同小异:

到现在为止,一切都很好。如果此代码多次运行(通过ch.leak.test.Test),则在完成堆分析时将只有一个 CustomClassLoader 实例,这意味着之前的实例已成功收集。

现在,这是触发泄漏的行:

这种对数据库的简单访问有一个奇怪的结果:一次运行代码时,所使用的 CustomClassLoader 永远不会被垃圾收集(即使没有任何 GC 根)。但是,所有进一步创建的 CustomClassLoader 都不会泄漏。

正如我们在下面的转储中看到的(使用 VisualVM 完成),实例 id 为 0 的 CustomClassLoader 永远不会被垃圾收集...... CustomClassLoader 没有被垃圾收集

最后,我在探索堆转储时看到的另一件事:我的实体在 PermGen 中声明了两次,其中一半没有实例,也没有 GC 根(但它们没有链接到 CustomClassLoader)。 在此处输入图像描述

似乎 OpenJPA 与这些泄漏有关......但我不知道在哪里可以搜索关于我做错了什么的更多信息。我还将堆转储直接放入项目的 zip 中。有人有想法吗?

谢谢 !

0 投票
1 回答
808 浏览

java - Java EE 5 安全注释在 glassfish v2 中的方法上被忽略

我有一个简单的 EE5 应用程序,带有一个 Web 客户端和一个运行 glassfish 2 的 ejb 模块。ejb 中方法上的安全注释被忽略,但类级别的安全注释却没有。

例如我有以下bean:

每个用户都可以调用此方法。调试语句返回正确的值。

web.xml 中定义的 web 客户端中的 Web 资源的安全约束按预期工作,但不是 mwthods 上的注释中定义的那些。

在我的 application.xml 中,我定义了领域和角色。我将它们映射到 sun-application.xml 中。

可能是什么原因?这是 glassfish v2 的已知问题吗?它在 glassfish v3 中正常工作。

其他资源:

sun-ejb-jar.xml

ejb-jar.xml

应用程序.xml

太阳应用程序.xml

web.xml

0 投票
0 回答
323 浏览

java - GWT 2.5 导致服务器 (GF 2.1.1) 挂起 - 多个 RPC 连接处于 CLOSE_WAIT 状态

库升级(GWT 2.4.0 -> GWT 2.5.0)是必要的。不幸的是,较新的版本似乎会导致更多的问题,而不是它实际解决的问题。

许多“死”连接(数百个)在服务器上累积,直到它停止响应。netstat -na给出以下结果:

它仅发生在 GWT 2.5.0 上,而没有发生在 GWT 2.4.0 上。代码没有其他变化。不幸的是,我无法在本地重现该问题。在我的本地环境和服务器机器上都使用了 GlassFish 2.1.1(我现在坚持使用它,但是如果该问题与应用程序服务器有关,那么知道它仍然很高兴)。服务器上的操作系统是 Debian Squeeze 64 位,本地我使用 Wheezy 32 位。

在绝望中,我使用以下代码添加了过滤器:httpServletResponse.setHeader("Connection", "close");但没有结果。

您是否有任何想法如何解决该问题或如何跟踪哪些连接导致问题以及何时导致问题?谢谢!

0 投票
1 回答
163 浏览

web-applications - Glassfish2.1 在运行 JSF2.1 应用程序时需要 JSP

我正在尝试在 Glassfish2.1 上运行 jsf 2.1 应用程序。WAR 文件部署成功,但是当我运行应用程序时,它给出了 HTTP 404 错误。在日志中,我可以看到以下内容

我想知道为什么它需要 JSP,它应该寻找的 URL 是 fal/search.jsf。我已经在 J​​Boss7.1 上运行了这个应用程序,它在那里运行得很好。我的应用程序中没有 JSP,我创建了 .xhtml 文件。这是我的web.xml的相关内容

faces-context.xml

我尝试在 web-xml 中的这个 servlet 的 url-pattern 中添加 *.jsp,但这也不起作用。我有

那它为什么要找JSP??有没有办法解决这个问题?


我们无法在 Glassfish 2.1 上解决这个问题。最后我们迁移到 JBoss 7.1。


0 投票
2 回答
3600 浏览

deployment - Maven-glassfish-plugin:如何指定部署目标?

我将 Maven 3.0.4 与 maven-glassfish-plugin 2.1 ( http://maven-glassfish-plugin.java.net/ ) 和 Glassfish 2.1.1 一起使用。

相关 POM.XML 片段:

问题是,我部署到的 Glassfish 服务器为每个开发人员配置了一个独立实例,并且运行mvn glassfish:deploy原因:

注意--target server执行的命令。

如何在 POM 中指定target要部署到的实例(即)?

0 投票
2 回答
749 浏览

java - 当我将它放入与将其从数据库中拉出时,new String(byte[]) 会给出不同的结果

在我将字节数组保存到数据库之前,如果我打印它的输出new String(data)会返回一个可读的字符串,例如“foobar”,但是在我将它从数据库中拉出之后,new String(data)会读起来像一堆乱码,例如“9238929384739427349327 ...”。这里有很多部分,我将尝试将它们全部列出。我正在使用 eclipselink 并且我的数据列已定义:

如果我运行此代码:

它输出windows-1250.

我的数据库定义为:

我也在这样定义的数据库上试过这个:

并且问题仍然存在。

我认为发生的事情是我的数据库与我的应用服务器的编码不同。当我将内容放入数据库并再次将其取出时,它以错误的方式对其进行解码,因此看起来像乱码。我有什么事情吗?

现在,当谈到解决这个问题时,我有点困惑。我认为我应该做的是将我的应用服务器的文件编码更改为与数据库相同。我正在使用 Glassfish 2.1.1。当我application server -> advanced -> domain attributes将语言环境设置为“UTF8”或“UTF-8”时,它告诉我需要重新启动。重新启动 glassfish 后,该字段仍为空白,并且仍然出现错误。我想也许它没有节省财产。我会手动将它放在配置文件中,但我不知道该放在哪里或放什么。

或者,我尝试使用 ENCODING = 'WIN1250' 创建我的数据库,但是当我这样做时,它说我的 LC_CTYPE 需要是“WIN1252”。当我将 LC_CTYPE 设置为“WIN1252”时,它说编码不存在。


我在这方面花了很多时间,我想知道我是否在这里做一些事情。我的“appserver 和 db 之间的编码不同步”的理论听起来是正确的,还是我在追逐红鲱鱼?如果有人可以帮助我弄清楚如何更改 glassfish 2.1.1 的此设置,那也将非常有帮助。谢谢

编辑:人们问我为什么将字符串存储为原始字节。这不完全是我正在做的事情,有时原始字节代表图像或pdf或二进制文件,有时是文本。我的测试是插入一个纯文本字符串并将其拉回以确保它被正确保存。这个测试通过了我们在 linux 上的 CI 服务器。

EDIT2:我被要求显示原始二进制输入与原始二进制输出。

预期:[116、104、105、115、32、105、115、32、109、121、32、97、116、116、97、99、104、109、101、110、116、32、97、115 , 32, 97, 32, 83, 116, 114, 105, 110, 103]

实际:[60, 54, 56, 54, 57, 55, 51, 50, 48, 54, 57, 55, 51, 50, 48, 54, 100, 55, 57, 50, 48, 54, 49, 55 , 52, 55, 52, 54, 49, 54, 51, 54, 56, 54, 100, 54, 53, 54, 101, 55, 52, 50, 48, 54, 49, 55, 51, 50, 48 , 54, 49, 50, 48, 53, 51, 55, 52, 55, 50, 54, 57, 54, 101, 54, 55]

我给了我在 Mac 上的同事检查字节的相同测试,并且它通过了他。

0 投票
1 回答
586 浏览

java - Jersey Multipart 1.13 和 Glassfish 2.1.1 看起来不兼容

在 Glassfish 2.1.1 服务器上使用 Jersey Multipart 1.13 部署战争时,随后出现以下错误消息:

方法,公共 javax.ws.rs.core.Response no.xx.nn.resources.ConverterResources.post(java.lang.String,java.lang.String,java.io.InputStream),用资源、类的 POST 注释oo.xx.nn.resources.ConverterResources,未被识别为使用 @HttpMethod 注释的有效 Java 方法。在 com.sun.jersey.server.impl.model.method.ResourceHttpMethod.(ResourceHttpMethod.java:92) 在 com.sun.jersey.server.impl.model.method.ResourceHttpMethod.(ResourceHttpMethod.java:69) 在 com .sun.jersey.server.impl.model.method.ResourceHttpMethod.(ResourceHttpMethod.java:61) 在 com.sun.jersey.server.impl.model.ResourceClass.processMethods(ResourceClass.java:283) 在 com.sun。 jersey.server.impl.model.ResourceClass.(ResourceClass.java:131)

经过反复试验,我发现这属于以下代码:

更具体地说是@FormDataParam参数注释。当移除这些时,战争部署得很好。我试图在没有任何运气的情况下添加@DefaultValue到所有 s 中。@FormDataParam另外,我尝试添加一个@Produces, 也没有任何运气。该错误似乎与当前也没有@Consumes(..)任何关系。

web.xml看起来很标准:

我已经包含了所有必需的 Jersey 依赖项,如下所示:

我也尝试过从 IDEA 部署到 Tomcat6 和 Glassfish 3.1.1,效果很好。在本地和远程的 Java 7 上运行(它不起作用)。有任何想法吗?

0 投票
3 回答
1214 浏览

java - PWC1231 和 PWC6344

我有两台在Glassfish 2.1上运行的服务器,它们都有相同的网络应用程序。

两次出现这个错误:一些jsp页面停止显示只显示一个空白页面,并且在日志中打印了以下错误...

PWC1231:servlet jsp 的 Servlet.service() 抛出异常 java.io.FileNotFoundException: /path/to/jsp/file/jsp_file.jsp.java (Permission denied) at java.io.FileOutputStream.open(Native Method) at java .io.FileOutputStream.(FileOutputStream.java:179) 在 org.apache.jasper.compiler.AntJavaCompiler.getJavaWriter(AntJavaCompiler.java:213) 在 org.apache.java.io.FileOutputStream.(FileOutputStream.java:70)。 jasper.compiler.Compiler.generateJava(Compiler.java:173) 在 org.apache.jasper.compiler.Compiler.compile(Compiler.java:409) 在 org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:592)在 org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:344) 在 org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:470) 在 org.apache.jasper.servlet.JspServlet。service(JspServlet.java:364) at javax.servlet.http.HttpServlet.service(HttpServlet.java:831) at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:411) at org.apache.catalina .core.ApplicationDispatcher.doInvoke(ApplicationDispatcher.java:855) 在 org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:703) 在 org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:542 ) 在 org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:366) 在 org.apache.struts.action.RequestProcessor 的 org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:474)。 doForward(RequestProcessor.java:1056) 在 org.apache.struts.tiles.TilesRequestProcessor。doForward(TilesRequestProcessor.java:261) at org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:388) at org.apache.struts.tiles.TilesRequestProcessor.processForwardConfig(TilesRequestProcessor.java:316) at org.apache .struts.action.RequestProcessor.process(RequestProcessor.java:231) 在 org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164) 在 org.apache.struts.action.ActionServlet.doPost(ActionServlet.java :415) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:738) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:831) 在 org.apache.catalina.core.ApplicationFilterChain.servletService( ApplicationFilterChain.java:411) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:317) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:198) 在 com.my.app.filtro.FiltroCallcenter.doFilter(FiltroCallcenter.java:90) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain. java:230) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:198) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:288) at org.apache.catalina.core .StandardContextValve.invokeInternal(StandardContextValve.java:271) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:202) 在 org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632) 在com.sun.enterprise 的 org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577)。web.WebPipeline.invoke(WebPipeline.java:94) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:206) 在 org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632)在 org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577) 在 org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571) 在 org.apache.catalina.core.ContainerBase.invoke (ContainerBase.java:1080) 在 org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:632) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:150)。 catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:577) 在 org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:571) 在 org.apache.catalina.core。ContainerBase.invoke(ContainerBase.java:1080) 在 org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:272) 在 com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:第637章) .sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:341) 在 com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:263) 在 com.sun.enterprise .web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:214) 在 com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265)在 com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106)

紧随其后的是:

PWC6344: 无法为文件 /path/to/jsp/file/jsp_file.jsp.java|#] 创建输出编写器

有时只打印 PWC6344 错误,有时两者都打印,PWC1231 错误后面总是跟着 PWC6344(这有点道理,因为发生 IOException 时会抛出该异常)。

好吧,两次都发生了这个错误,我唯一做的就是停止并启动实例,一切又好了,而且这个错误只发生在其中一个服务器上。

发生了什么事?...或者我如何诊断是什么导致了这种情况,这样我就可以解决问题,而不是永远停止并重新开始...

更新:

正如 sbridges 所建议的那样,我正在调查这可能是文件描述符问题,但是!,文件处理程序的最大数量是 811975,其中一个服务器上打开了 4520 个文件,而另一个服务器上只有 6894 个文件处理程序是 359532。

所以,我想可以肯定地说这不是问题!

有人有其他理论吗?

0 投票
1 回答
59 浏览

glassfish - 如何在 glassfish 3 中获取 ServerContext

我是一个 12 岁以上的代码库的“骄傲”继承人,多年来许多工程师都在开发这个代码库。我的任务是将我们的系统从 glassfish 2.1.1 升级到 glassfish 3.1.2.2。在指向新的 glassfish 3 jars 之后,大多数东西都可以正常编译,除了我遇到的这个问题。有这样一种方法:

编译器找不到“com.sun.enterprise.server.ApplicationServer”。我假设有一种使用 glassifsh 3 获取 ServerContext 的新方法。有人有什么建议吗?