这是我一直试图追踪几个月的问题.我有一个运行java应用程序来处理xml提要并将结果存储在数据库中.存在非常难以追踪的间歇性资源问题.
背景: 在生产盒(问题最明显的地方),我没有特别好的访问框,并且无法运行Jprofiler.那个盒子是64位四核,8GB机器运行centos 5.2,tomcat6和java 1.6.0.11.它从这些java-opts开始
JAVA_OPTS="-server -Xmx5g -Xms4g -Xss256k -XX:MaxPermSize=256m -XX:+PrintGCDetails -
XX:+PrintGCTimeStamps -XX:+UseConcMarkSweepGC -XX:+PrintTenuringDistribution -XX:+UseParNewGC"
Run Code Online (Sandbox Code Playgroud)
技术堆栈如下:
我能解决的最接近问题的是32位机器,内存要求较低.我确实有控制权.我已经使用JProfiler探测它并修复了许多性能问题(同步问题,预编译/缓存xpath查询,减少了线程池,删除了不必要的hibernate预取,以及在处理过程中过度热心的"缓存变暖").
在每种情况下,分析器都会将这些资源显示为由于某种原因而占用大量资源,并且一旦发生变化,这些资源就不再是主要资源.
问题: JVM似乎完全忽略了内存使用设置,填满了所有内存并且没有响应.对于面向客户的人来说,这是一个问题,他们期望定期投票(5分钟和1分钟重试),以及我们的运营团队,他们经常被告知箱子已经无响应并且必须重新启动它.这个盒子上没有其他重要的东西.
问题似乎是垃圾收集.我们正在使用ConcurrentMarkSweep(如上所述)收集器,因为原始STW收集器导致JDBC超时并变得越来越慢.日志显示,随着内存使用量的增加,这开始引发cms失败,并回到最初的世界收藏家,然后似乎没有正确收集.
然而,运行jprofiler,"运行GC"按钮似乎很好地清理内存而不是显示增加的占用空间,但由于我无法将jprofiler直接连接到生产盒,并且解决已证实的热点似乎无法正常工作我是留下了调整垃圾收集盲人的伏都教.
我尝试过的:
不幸的是,问题也偶尔会出现,它似乎是不可预测的,它可以运行几天甚至一周而没有任何问题,或者它可以在一天内失败40次,而且我唯一可以看到的是一致的是垃圾收集正在起作用.
任何人都可以提出以下建议:
a)为什么JVM在配置为最大值小于6时使用8个物理演出和2 gb交换空间
.b)对GC调整的引用实际上解释或给出了合理的示例什么样的设置使用高级集合.
c)对最常见的java内存泄漏的引用(我理解无人认领的引用,但我的意思是在库/框架级别,或者在数据结构中更像inherenet,比如hashmaps).
感谢您提供的任何和所有见解.
编辑
Emil H:
1)是的,我的开发集群是生产数据的镜像,直到媒体服务器.主要的区别是32/64bit和可用的RAM量,我无法轻易复制,但代码和查询和设置是相同的.
2)有一些遗留代码依赖于JaxB,但在重新排序作业以试图避免调度冲突时,我通常会删除执行,因为它每天运行一次.主解析器使用调用java.xml.xpath包的XPath查询.这是一些热点的来源,其中一个查询没有被预编译,两个对它们的引用都是硬编码的字符串.我创建了一个线程安全缓存(hashmap),并将对xpath查询的引用考虑为最终的静态字符串,从而显着降低了资源消耗.查询仍然是处理的很大一部分,但应该是因为这是应用程序的主要责任.
3)另外一个注释,另一个主要消费者是来自JAI的图像操作(从饲料中重新处理图像).我不熟悉java的图形库,但从我发现它们并没有特别漏洞.
(感谢目前为止的答案,伙计们!)
更新:
我能够使用VisualVM连接到生产实例,但它已禁用GC可视化/运行GC选项(尽管我可以在本地查看).有趣的是:VM的堆分配服从JAVA_OPTS,并且实际分配的堆正好坐在1-1.5 gigs,并且似乎没有泄漏,但是盒级监控仍显示泄漏模式,但它是没有反映在VM监控中.这个盒子上没有别的东西在跑,所以我很难过.
在处理了另一个愚蠢的日食问题之后,我想尝试尽可能地获得最轻,最小的Eclipse安装.
要清楚,我将eclipse用于两件事:
我通过Emacs/Zsh做的其他事情(编辑JSP/XML/JS,文件管理,SVN签到等).我没有找到在Eclipse中工作的任何方面来使这些任务高效甚至可靠,所以我不想要与之相关的插件.
从eclipse.org网站,这是他们拥有的最轻的eclipse安装,我不想要任何这些东西(Bugzilla,Mylyn,CVS xml_ui),并且实际上每个都有问题,即使我做了不要用它们.
那么我能得到的最小构建是什么:
没有任何额外的插件,平台或与其他平台的"集成",具体来说,我不想处理与以下相关的插件:
Maven,JSP验证,Javascript编辑或验证,CVS或SVN,Mylyn,Spring或Hibernate"自然",app服务器,如捆绑的Tomcat/GlassFish/etc,J2EE工具或任何类似的东西.
我主要使用Spring/Hibernate/web-mvc应用程序,并且从未处理过优雅处理任何内容的Eclipse插件,我可以使用自己的工具集有效地工作,但Eclipse扩展只会阻碍它.
我曾经使用普通eclipse进行Ganymede,MyEclipse(高达7.5)以及最新版本的Spring-SourceTools,并发现他们都背负着无用的插件(虽然组合总是不同的).
切换到NetBeans/Intellij不是一个选项,我的队友使用SVN控制的.class/.project文件,所以它几乎必须是Eclipse.
有没有人对如何保存一些白发有任何好的建议?
我有一个6.5GB的Hprof文件,使用该-XX:-HeapDumpOnOutOfMemoryError
选项由64位JVM转储.我把它放在一台16GB的64位机器上,并且我试图将它放入jhat,但它一直在耗尽内存.我试过传递jvm args以获得最小设置,但它拒绝任何最小值,并且在达到最大值之前似乎耗尽了内存.
jvm耗尽内存会使堆积如此之大以至于无法将其加载到具有两倍ram的盒子上,这似乎有点愚蠢.有没有办法让这个运行,或可能摊销分析?
我试图在Eclipse中放入一个我想念的功能,其中Alt+ [ Up/ Down]可以向上或向下转换行,但是在我的生活中不能找到如何正确分配这些键的功能.我在-nw
模式中使用它(所以只在shell窗口中),通常在屏幕会话中运行.
使用全局键绑定,我可以使用字母组合,比如(kbd "M-m")
,但是我为箭头键尝试的每个组合只给我一条没有意义的消息,我总是得到:
"ESC <up> is undefined"
Run Code Online (Sandbox Code Playgroud)
我尝试过的:
(global-set-key (kbd "M-<up>") 'transpose-line-up)
(global-set-key (kbd "<escape>-<up>") 'transpose-line-up)
(global-set-key [M-up] 'transpose-line-up)
(global-set-key [\e \M-O A] 'transpose-line-up)
Run Code Online (Sandbox Code Playgroud)
而且C-h c只是回报:
ESC <up> (translated from ESC M-O A) is undefined
Run Code Online (Sandbox Code Playgroud)
这些都不起作用,无论是使用ESC还是Alt.
知道如何让这个工作吗?我更愿意将这些作为Alt+ [ Up/ Down],因为这是我习惯的.
编辑
来自评论:
C-q Up打印^[OA
.
C-q M-Up打印^[
并将光标向上移动一行.
C-h k(Alt+ Up)打印 …
为了清楚,这是python 2.6,我正在使用pytz.
这是针对仅处理美国时区的应用程序,我需要能够锚定日期(今天),并且仅在太平洋标准时间晚上8点和晚上11点获得unix时间戳(纪元时间).
这真让我抓狂.
> pacific = pytz.timezone("US/Pacific")
> datetime(2011,2,11,20,0,0,0,pacific)
datetime.datetime(2011, 2, 11, 20, 0, tzinfo=<DstTzInfo 'US/Pacific' PST-1 day, 16:00:0 STD>)
> datetime(2011,2,11,20,0,0,0,pacific).strftime("%s")
'1297454400'
zsh> date -d '@1297454400'
Fri Feb 11 12:00:00 PST 2011
Run Code Online (Sandbox Code Playgroud)
因此,即使我正在设置时区,并使用该时区创建日期时间,它仍然将其创建为UTC然后转换它.这是一个更大的问题,因为当我尝试进行计算时,UTC将会提前一天.
是否有一种简单(或至少是敏感)的方式来生成今天太平洋标准时间晚上8点的时间戳?
(很明显,我确实理解在大多数情况下使用UTC的价值,比如数据库时间戳,或者用于一般存储.这不是其中一种情况,我特别需要PST的晚上时间戳,UTC不应该进入它.)
我试图在遗留数据库(仍然有遗留的PHP客户端)上实现hibernate,并且遇到了一些问题,因为编写原始应用程序的人不知道他们在做什么.
设置数据库以使任何列都不可为空,因此如果没有记录,则将外键默认为0.此外,它们在表上没有正确的外键,因此有一些具有无效ID.我没有选项来更改架构或null相应的列.
这是我从hibernate得到的错误:
Caused by: org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [com.tv.platform.domain.Program#0]
Run Code Online (Sandbox Code Playgroud)
我想要的是一种优雅的方式来处理这个问题,如果该行无效或不存在,该字段将为空,但我没有运气找到如何在文档中处理这个问题.
有小费吗?
我正试图在我的tomcat环境中追踪配置问题.我们的生产服务器正在运行tomcat安装并从共享NFS挂载中读取战争.
但是,当我使用独立的盒子(使用它们的配置)尝试相同的战争时,我收到下面发布的错误.
有趣的是,如果我将WEB-INF/lib中的所有jar解压缩到WEB-INF/classes中,这个错误就会消失.
所以,似乎某些东西阻止了应用程序加载WEB-INF/lib路径,但我不能在我的生活中找到任何会导致这种情况的tomcat设置,因为它正在检测应用程序和配置,只是没有包括罐子.
有任何想法吗?
重度:类org.springframework.web.context.ContextLoaderListener抛出java.lang.ClassNotFoundException的错误配置应用程序监听器:org.springframework.web.context.ContextLoaderListener在org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387 )在org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)在org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3786)在org.apache.catalina.core.StandardContext.在org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)在org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)在org.apache开始(StandardContext.java:4342) .catalina.core.StandardHost.addChild(StandardHost.java:525)在org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:627)在org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java :553)org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:488)在org.apache.catalina.startup.HostConfig.start(HostConfig.java:1149)在org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)在org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent (LifecycleSupport.java:117)在org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)在org.apache.catalina.core.StandardHost.start(StandardHost.java:719)在org.apache. catalina.core.ContainerBase.start(ContainerBase.java:1045)在org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)在org.apache.catalina.core.StandardService.start(StandardService.java: 516)在org.apache.catalina.core.StandardServer.start(StandardServer.java:710)在org.apache.catalina.startup.Catalina.start(Catalina.java:578)在sun.reflect.NativeMethodAccessorImpl.invoke0(母语法)在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)在java.lang.reflect.Me thod.invoke(Method.java:597)org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)12月20日2011下午四点二十分38秒org.apache.catalina.core.StandardContext listenerStart严重:错误配置类org.springframework.security.web.session.HttpSessionEventPublisher抛出java.lang.ClassNotFoundException的应用监听器:org.springframework.security.web .session.HttpSessionEventPublisher在org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387)在org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)在org.apache.catalina.core .StandardContext.listenerStart(StandardContext.java:3786)在org.apache.catalina.core.StandardContext.start(StandardContext.java:4342)在org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)在org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)at org.apache.catalina.core.StandardHost.的addChild(StandardHost.java:525)在org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:627)在org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:553)在org.apache .catalina.startup.HostConfig.deployApps(HostConfig.java:488)在org.apache.catalina.startup.HostConfig.start(HostConfig.java:1149)在org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java :311)在org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)在org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)在org.apache.catalina.core. StandardHost.start(StandardHost.java:719)在org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)在org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)在组织.apache.catalina.core.StandardService.start(StandardService.java:516)位于org.apache.catalina.startup.Catalina.start(Catalina)的org.apache.catalina.core.StandardServer.start(StandardServer.java:710)的.java:578)在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)在java的. lang.reflect.Method.invoke(Method.java:597)org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)org.apache.catalina.startup.Bootstrap.main(Bootstrap.java: 413)
我有一个原型风暴应用程序,它读取STOMP流并将输出存储在HBase上.它有效,但不是很灵活,我试图以与我们的其他应用程序更一致的方式设置它,但没有太多运气搞清楚当前使用Storm的方式.我们使用spring-jms类,但不是以标准spring方式使用它们,而是在运行时创建它们,并手动设置依赖项.
这个项目:https://github.com/granthenke/storm-spring看起来很有前景,但由于风暴罐被带入apache孵化器并重新包装,因此几年内没有被触及并且无法正常构建.
有没有我想念的东西,或者将这些东西整合在一起是不值得的?
我正在开发一个遗留Java应用程序,它有大约6k警告,我正在尝试清理.其中一个就是"不必要的@Suppresswarnings('XXXX')".Eclipse有一个快速解决方案,但代码库中有几百个,甚至更多实际使用它的实例.
我希望能够立即对所有这些警告应用"快速修复"(删除未使用的令牌),但似乎无法找到实现这一目标的方法.由于使用的这个注释的许多(更多)实例没有生成警告,因此注释的强制条带只会创建更多警告.
有没有办法在eclipse(或者可能是第三方工具)中执行此操作,或者我只是运气不好?
java ×7
eclipse ×2
memory-leaks ×2
spring ×2
annotations ×1
apache-storm ×1
classpath ×1
datetime ×1
emacs ×1
emacs23 ×1
gnu-screen ×1
heap ×1
hibernate ×1
ide ×1
jhat ×1
jvm ×1
key-bindings ×1
mysql ×1
profiling ×1
pst ×1
python ×1
pytz ×1
tomcat6 ×1
warnings ×1
web-inf ×1