jsp 文件太大导致 java 服务器 crash
碰到这样一个问题,访问普通的jsp程序,居然导致Java服务器 Crash 死掉:
#
# An unexpected error has been detected by HotSpot Virtual Machine:
#
# EXCEPTION_PRIV_INSTRUCTION (0xc0000096) at pc=0x00b024b1, pid=692, tid=5476
#
# Java VM: Java HotSpot(TM) Client VM (1.5.0_04-b05 mixed mode)
# Problematic frame:
# j jsp_servlet._web_45_inf._pages._be._change.__be_modify_info_start._jspService (Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V+1026
#
--------------- T H R E A D ---------------
Current thread (0x54892008): JavaThread "[ACTIVE] ExecuteThread: '2' for queue: 'weblogic.kernel.Default (self-tuning)'" daemon [_thread_in_Java, id=5476]
siginfo: ExceptionCode=0xc0000096
Registers:
EAX=0xffffffff, EBX=0x00000071, ECX=0x00038490, EDX=0x00000000
ESP=0x558be594, EBP=0x558be5e4, ESI=0x4cd46ad6, EDI=0x558beb44
EIP=0x00b024b1, EFLAGS=0x00010216
Top of Stack: (sp=0x558be594)
0x558be594: 558beb44 4cd46ad6 558be5e4 558be5b4
0x558be5a4: 00000071 00000279 4cd58fa8 00000000
0x558be5b4: 00b024ab 6d7f5358 08a20c58 08a20c58
0x558be5c4: 03dacf30 558be5c8 4cd46852 558beb44
0x558be5d4: 4cd6e328 00000000 4cd58fa8 558beb3c
0x558be5e4: 558beb64 00b02923 00000000 00000000
0x558be5f4: 00000000 00000000 00000000 00000000
0x558be604: 00000000 00000000 00000000 00000000
Instructions: (pc=0x00b024b1)
0x00b024a1: 68 58 53 7f 6d e8 00 00 00 00 60 e8 15 7b bb 6c
0x00b024b1: f4 90 90 00 00 00 00 00 00 00 00 00 00 00 00 80
Stack: [0x55880000,0x558c0000), sp=0x558be594, free space=249k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
j jsp_servlet._web_45_inf._pages._be._change.__be_modify_info_start._jspService (Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V+1026
j weblogic.servlet.jsp.JspBase.service(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V+9
j weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run()Ljava/lang/Object;+43
原来是该jsp文件太大,因为编译后的_jspService 方法 jsp_servlet._web_45_inf._pages._be._change.__be_modify_info_start._jspService 超过了Java语言规定的方法最大64k 大小。
you can extract those tables into another JSP and be included via <jsp:include />. This will cut away the binary size of that table within the service method. Do not use <% @ include %>, which still compiled the jsps into service method.
comment away
<jsp-param>
<param-name>jspServlet</param-name>
<param-value>weblogic.servlet.WlwJSPServlet</param-value>
</jsp-param>
in weblogic.xml
to use back default jspc jsp compiler. Default jspc jsp compiler is more tolerance to errors and you can even use "keepgenerated" <param> tag to generate java source, which is very useful to re-factor out tables.
Strive to put code/logics into java method or <%! %> region, this cut down the size of service() method.
http://futuretask.blogspot.com/2005/01/java-tip-5-avoid-64kb-method-limit-on.html
http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html#88659
为什么要少用 Iframe ?
iframes 提供了一个简单的方式把一个网站的内容嵌入到另一个网站中。但我们需要慎重的使用iframe。iframe的创建比其它包括scripts和css的 DOM 元素的创建慢了 1-2 个数量级。下图显示创建 100 个不同的元素中iframe到底有多耗费时间。
创建100个 elements 的耗时
使用 iframe 的页面一般不会包含太多 iframe,所以创建 DOM 节点所花费的时间不会占很大的比重。但带来一些其它的问题:onload 事件以及连接池(connection pool)。
Iframes 阻塞页面加载
及时触发 window 的 onload 事件是非常重要的。onload 事件触发使浏览器的 “忙” 指示器停止,告诉用户当前网页已经加载完毕。当 onload 事件加载延迟后,它给用户的感觉就是这个网页非常慢。
window 的 onload 事件需要在所有 iframe 加载完毕后(包含里面的元素)才会触发。在 Safari 和 Chrome 里,通过 JavaScript 动态设置 iframe 的 SRC 可以避免这种阻塞情况。
唯一的连接池
浏览器只能开少量的连接到web服务器。比较老的浏览器,包含 Internet Explorer 6 & 7 和 Firefox 2,只能对一个域名(hostname)同时打开两个连接。这个数量的限制在新版本的浏览器中有所提高。Safari 3+ 和 Opera 9+ 可同时对一个域名打开 4 个连接,Chrome 1+, IE 8 以及 Firefox 3 可以同时打开 6 个。你可以通过这篇文章查看具体的数据表:Roundup on Parallel Connections.
有人可能希望 iframe 会有自己独立的连接池,但不是这样的。绝大部分浏览器,主页面和其中的 iframe 是共享这些连接的。这意味着 iframe 在加载资源时可能用光了所有的可用连接,从而阻塞了主页面资源的加载。如果 iframe 中的内容比主页面的内容更重要,这当然是很好的。但通常情况下,iframe 里的内容是没有主页面的内容重要的。这时 iframe 中用光了可用的连接就是不值得的了。一种解决办法是,在主页面上重要的元素加载完毕后,再动态设置 iframe 的 SRC。
美国前 10 大网站都使用了 iframe。大部分情况下,他们用它来加载广告。这是可以理解的,也是一种符合逻辑的解决方案,用一种简单的办法来加载广告服务。但请记住,iframe 会给你的页面性能带来冲击。只要可能,不要使用 iframe。当确实需要时,谨慎的使用他们。
解决Oracle启动listener监听器hostname配置不一致的错误
TNS-12560: TNS: 协议适配器错误和TNS-00530: 协议适配器错误,可能是由于在win7系统启动cmd.exe没有以“管理员身份运行”。
Oracle启动listener监听器的时候经常会出现无法启动的错误,这些错误大多数是因为listener.ora配置问题引起,listener.ora中的HOST、Oracle实例的v$instance中的HOST_NAME与tnsnames.ora的HOST必须一致,最好在操作系统hosts文件中增加hostname对应IP的配置。
下面是启动listener时listener.ora,sqlnet.ora,tnsnames.ora配置问题解决思路:
Via: http://www.ixdba.net/hbcms/article/ec/231.html
1:监听文件listener.ora tnsnames.ora中关于host的配置建议都用ip来表示,
2:如果监听不能启动或者启动后不能正常使用,
(1)首先确认你的OS的hostname,执行hostname命令,尝试ping "hostname",看是否能通,
(2)然后检查监听的listener.ora ,tnsnames.ora这两个配置文件中关于host的信息是否是用主机名表示的。
(3)如果是,更改到新的主机名,然后把新的主机名加入系统的hosts文件,linux下为/etc/hosts;
然后ping 新主机名,应该能通的。
(4)如果全部是用ip表示的,那么直接将新的主机名加入系统的hosts文件即可。
然后ping 新主机名,也应该能通的。
3:如果第二步还是解决不了问题,
(1)检查启动的oracle的instance信息,select * fromv$instance;
然后查看本级系统的主机名,两者应该是相等的。
(2)如果查询出来的是老的主机名,尝试"ping老主机名"应该不通,
通过listener也应该是连结不上;
(3)如果是新的主机名,如果"ping新主机名"不通,
请修改/etc/hosts文件增加新主机名,确认能ping通,然后重启oracle
4:注意tns和listener文件的设置。
具体操作步骤:
1)修改hostname为itindex.net
2)修改/etc/hosts,去掉原来的主机名的行,增加该行
192.168.60.253 itindex.net
3)重启数据库,查询instance信息
select * from v$instance;
得到新的HOST_NAME为 itindex.net
4)修改listener.ora,把HOST改成新的主机名
5)修改tnsname.ora,修改对应的HOST为新的主机名
6)重启listener
然后connect oracle/oracle@standby应该可以成功的。