/// <summary> /// 获取Img标签 /// </summary> /// <param name="htmlText">截获到的html代码</param> /// <returns></returns> public static List<string> GetPadImg(string htmlText) { List<string> list = new List<string>(); Regex regImg = new Regex(@"<img\b[^<>]*?\bsrc[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgUrl>[^\s\t\r\n""'<>]*)[^<>]*?/?[\s\t\r\n]*>", RegexOptions.IgnoreCase); MatchCollection mc = regImg.Matches(htmlText); foreach (Match m in mc) { list.Add(m.Groups["imgUrl"].Value); //获取Img标签 } return list; }
今天在做公司一个工程2个版本的运行时,突然出现新版的工程在tomcat中内存溢出。
因为错误比较明显,但也经过了一些折腾。
我的tomcat版本为最新的7.0.34,eclipse为3.7
在tomcat的wiki上其实对内存溢出和内存错误已经有一定的分析和说明
tomcat内存出错的一些原因:
1、建立的过多的对象,导致堆区内存不足
2、有代码被对象持有而导致垃圾收集器无法清理
3、超过了系统文件的大小限制,这样你需要提高你的权限或者用一个不受限制的。
4、你工程的线程数目过多,某些系统在同一个进程里对线程数目有限制,去看系统文档,和学习怎么提高这个数目
5、系统也许限制了你的进程的内存大小
6、JVM有bug,一般在低版本的jvm才出现
还介绍了内存溢出的一些常见处理方式
1、如果发现一个servlet装载大量的内容进入内存,你应该检查下你的代码是不是有bug
2、手动增加堆内存,导致没有空间去创建必须创建的那些线程所需要的栈空间,每个系统对线程创建所要消耗的栈默认不太相同,但是基本都高于2M,而且这个不能通过设置-Xss去减少
所以有一个规则,在32位系统下,对堆内存的分配一般不超过1024M
3、深度递归算法会导致内存出问题,因为方法信息都在栈中,所以一个可以用-Xss增加栈空间,另一个最好去优化你的算法
4、加载了大量的jar包或者同时维持几个项目将消耗你的非堆内存,在这种情况下-XX:MaxPermSize 去增加你的非堆内存
5、强引用导致垃圾收集器无法回收内存。可能会出现jsp重编译,工程重新加载,这将消耗大量时间,只到非堆内存得到清理或者内存溢出。
我今天的tomcat抛出的就是非堆内存溢出,可能是因为新的版本又加了一些jar包的缘故。
处理过程
第一次折腾:在tomcat\bin\catalina.bat 中 set JAVA_OPTS=%JAVA_OPT% -server -XX:PermSize=128m -XX:MaxPermSize=1024m
或者直接写 set JAVA_OPTS= -XX:PermSize=128m -XX:MaxPermSize=1024m
直接在tomcat启动,OK,工程正常启动
但是发现eclipse不认账
第二次折腾,打开 open launch configuration
点击Arguments选项卡
VM arguments 中添加
-Xms128m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=1024
OK,解决完毕
已有 0 人发表留言,猛击->>这里<<-参与讨论
ITeye推荐
- —软件人才免语言低担保 赴美带薪读研!—
SwfFile : escape("xxxx.swf");
这里,可能会造成很容易通过绝对路径下载到swf的地址,于是可以下载到swf,那么有什么好的方法保护之呢?当然,要搞到很复杂是不大可能的,除非有百度的能力,但简单的保护还是有办法的.
办法就是,其实flexpaper的SwfFile是支持以文件流的方式读文件的,所以,
可以简单写一个action或者servlet来读取,代码如下:
try { ServletOutputStream out = this.getResponse().getOutputStream (); this.ismsdocversion = this.docversionsService .getswfnamebydocumentId(documentId); String realPath =ServletActionContext.getServletContext().getRealPath("swffiles")+"/"+this.ismsdocversion.getAttachmentflashname(); logger.info("swrealpath is"+realPath); InputStream ips = null; OutputStream ops = null; this.getResponse().reset(); this.getResponse().setContentType("application/swf"); File file = new File(realPath); ops = this.getResponse().getOutputStream(); ips = new FileInputStream(file); this.getResponse().addHeader("Content-Length", new Long(file.length()).toString()); int i = 0; byte[] buffer = new byte[1024]; i = ips.read(buffer); while (i != -1) { ops.write(buffer, 0, i); i = ips.read(buffer); } ips.close(); ops.flush(); ops.close(); } catch (Exception e) { e.printStackTrace(); }
然后在flexpaper中,指定为:
SwfFile : escape('<%=basePath%>docview/docview!getSwffile.action?documentId=${ismsdocversion.documentId}'),
其实就是指定为这个servlet输出,这样就可以达到不能直接下载SWF的目的了.
另外,在网上发现一位北京兄弟搞的专门对flexpaper进行二次发开的
网站产品,功能比较强大,也受到这位兄弟的指点,特别感谢,
他的网站是:
http://flexpaper.studylead.com/
支持的功能有:
1、单页异步加载-速度奇快!!!
2、自定义在线播放器界面、可放上自己的公司Logo,或者换想要的皮肤。
3、word、ppt、excel、pdf、txt、wps等后台转换为swf功能。
4、可以使用OpenOffice和FlashPaper 两种方式转换 文件。
5、在线浏览文件格式:
MS Office文档: doc,docx ppt,pptx xls,xlsx vsd,vsdx pot,potx pps,ppsx rtf;
WPS office系列: wps et dps
图片: jpg png gif bmp
PDF: pdf
纯文本: txt
6、系统已经实现了关键字查询定位;可设置多个初始搜索关键字,以"|"分割,详见示例 关键字定位。
7、系统实现了控制文档显示页数,可用于收费文档使用,详见示例 控制文档显示页数。
8、系统实现了播放器加载广告,可用于文档添加广告使用,详见示例 播放器加载广告。
9、系统实现了播放器内按页插入广告,可自定义广告内容和插入位置;本站文档均添加了广告示例,请查看。
10、系统实现了全文检索,对文档建立索引,跟百度搜索类似,详见网站搜索。
有兴趣的朋友可以看看
已有 0 人发表留言,猛击->>这里<<-参与讨论
ITeye推荐
- —软件人才免语言低担保 赴美带薪读研!—