<<上篇 | 首页 | 下篇>>

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。当确实需要时,谨慎的使用他们。

 

来源:英文原文   中文编译: IT瘾     转载请保留原文链接

 

标签 : ,

解决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应该可以成功的。

 

标签 : ,