posts - 35,  comments - 7,  trackbacks - 0

创建一个密钥文件,
%JAVA_HOME%/bin/keytool -genkey -alias myalias   -keyalg RSA  -validity 3650 -keystore ./mykeystorefilename

修改conf/server.xml,打开Tomcat的HTTPS端口,
    <Connector port="8443"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" disableUploadTimeout="true"
               acceptCount="100" debug="0" scheme="https" secure="true"
               keystoreFile="mykeystorefilepath" 
               keystorePass="mykeystorepassword" >
      <Factory clientAuth="false" protocol="TLS" />
    </Connector>
   
在应用中修改web.xml,增加授权区
<security-constraint>
        <web-resource-collection>
                <url-pattern>/*</url-pattern>
                <http-method>GET</http-method>
                <http-method>POST</http-method>
        </web-resource-collection>
        <user-data-constraint>
                <transport-guarantee>CONFIDENTIAL</transport-guarantee>
        </user-data-constraint>
</security-constraint>

posted @ 2006-01-21 21:32 java小记 阅读(167) | 评论 (0)编辑 收藏


指定网络名称不可用
The specified network name is no longer available. : winnt_accept: Asynchronous AcceptEx failed.

An operation was attempted on something that is not a socket.:winnt_accept: AcceptEx failed. Attempting to recover.

出现这样的问题,解决方法是:禁止使用AcceptEx,方法为在httpd.conf文件中增加Win32DisableAcceptEx标记,例如:
       <IfModule mpm_winnt.c>
       ..........
             Win32DisableAcceptEx
       .........
       </IfModule>
虽然这样会使性能降低一些.
from apache docs2.0:
AcceptEx() is a Microsoft WinSock v2 API that provides some performance improvements over the use of
the BSD style accept() API in certain circumstances. Some popular Windows products, typically virus
scanning or virtual private network packages, have bugs that interfere with the proper operation of
AcceptEx(). If you encounter an error condition like:
[error] (730038)An operation was attempted on something that is not a socket.: winnt_accept: AcceptEx
failed. Attempting to recover.
you should use this directive to disable the use of AcceptEx().

posted @ 2006-01-21 21:07 java小记 阅读(365) | 评论 (0)编辑 收藏

在tomcat配置文件server.xml的<Connector ... />配置中,有和连接数相关的参数:
 <Connector
port="8080"               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               debug="0" connectionTimeout="20000"
               disableUploadTimeout="true" />

web server允许的最大连接数还受制于操作系统的内核参数设置,通常Windows是2000个左右,Linux是1000个左右。

posted @ 2006-01-05 13:29 java小记 阅读(643) | 评论 (0)编辑 收藏
在tomcat_home /conf/web.xml中,把listings参数设置成false即可
<servlet>
...
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
...
</servlet>
posted @ 2006-01-05 13:21 java小记 阅读(161) | 评论 (0)编辑 收藏

下面的这两个文件,尺寸差别很大.
%JAVA_HOME%/jre/bin/client/jvm.dll
%JAVA_HOME%/jre/bin/server/jvm.dll
Jvm动态库有client和server两个版本,分别针对桌面应用和服务器应用做了相应的优化,
client版本加载速度较快,server版本加载速度较慢但运行起来较快。

让Tomcat 使用Server版本的jvm吧,在开始菜单 tomcat5 ->tomcat config的java属性中有一项 jvm路径指向server目录下的jvm就行了。

更改默认java.exe调用的jvm.dll,这个由jvm.cfg决定。
编辑%JAVA_HOME%\jre\lib\i386\jvm.cfg 
里面第一行写的是 -client 默认就是client版本 ,把第二行的-server KNOWN 放到第一行, 如下面所示
-server KNOWN
-client KNOWN
-hotspot ALIASED_TO -client
-classic WARN
-native ERROR
-green ERROR
改完保存,然后看看默认版本:
C:\java -version
java version "1.4.2_07"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_07-b05)
Java HotSpot(TM) Server VM (build 1.4.2_07-b05, mixed mode)
看到有 Server VM 字样

posted @ 2006-01-05 13:09 java小记 阅读(245) | 评论 (0)编辑 收藏


内存不足 (OOM) - 由于 java 堆或本地内存中的内存耗尽,应用程序显示“内存不足”错误。
内存泄漏 - java 堆或本地内存的持续内存增长,最终将导致内存不足状态。调试内存泄漏状态的技术与调试内存不足状态的技术相同。

Java 堆 - 这是 JVM 用来分配 java 对象的内存。java 堆内存的最大值用 java 命令行中的 -Xmx 标志来指定。
如果未指定最大的堆大小,那么该极限值由 JVM 根据诸如计算机中的物理内存量和该时刻的可用空闲内存量这类
因素来决定。始终建议您指定最大的 java 堆值。

本地内存 - 这是 JVM 用于其内部操作的内存。JVM 将使用的本地内存堆数量取决于生成的代码量、创建的线程、
GC 期间用于保存 java 对象信息的内存,以及在代码生成、优化等过程中使用的临时空间。
如果有一个第三方本地模块,那么它也可能使用本地内存。例如,本地 JDBC 驱动程序将分配本地内存。
最大本地内存量受到任何特定操作系统上的虚拟进程大小限制的约束,也受到用 -Xmx 标志指定用于 java 堆的内存量的限制。
例如,如果应用程序能分配总计为 3 GB 的内存量,并且最大 java 堆的大小为 1 GB,那么本地内存量的最大值可能在 2 GB 左右。
 
进程大小 - 进程大小将是 java 堆、本地内存与加载的可执行文件和库所占用内存的总和。在 32 位操作系统上,进程的虚拟地址
空间最大可达到 4 GB。从这 4 GB 内存中,操作系统内核为自己保留一部分内存(通常为 1 - 2 GB)。剩余内存可用于应用程序。

Windows缺省情况下,2 GB 可用于应用程序,剩余 2 GB 保留供内核使用。但是,在 Windows 的一些变化版本中,有一个 /3GB 开关
可用于改变该分配比率,使应用程序能够获得 3 GB。有关 /3GB 开关的详细信息,可以在以下网址中找到:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ddtools/hh/ddtools/bootini_1fcj.asp
RH Linux AS 2.1 - 3 GB 可用于应用程序。

进程地址空间和物理内存之间的差异:
每个进程都获得其自有的地址空间。在 32 位操作系统中,此地址空间范围为 0 到 4 GB。此范围与计算机的可用随机存取内存 (RAM)
或交换空间无关。计算机中的可用物理内存总量是该计算机上的可用 RAM 和交换空间之和。所有运行的进程共享这些物理内存。

进程内的存储地址是虚拟地址。内核将此虚拟地址映射到物理地址上。物理地址指向物理内存中的某个位置。在任一给定时间,计算机
中运行进程所使用的全部虚拟内存的总和不能超过该计算机上可用物理内存的总量。


为什么会发生 OOM 问题,JVM 在这种情况下如何处理?

如果 JVM 不能在 java 堆中获得更多内存来分配更多 java 对象,将会抛出 java 内存不足 (java OOM) 错误。如果 java 堆充满了活
动对象,并且 JVM 无法再扩展 java 堆,那么它将不能分配更多 java 对象。
在这种情况下,JVM 让应用程序决定在抛出 java.lang.OutOfMemoryError 后该执行什么操作。例如,应用程序可以处理此错误,并决定
以安全方式自行关闭或决定忽略此错误。如果应用程序不处理此错误,那么抛出此错误的线程将退出(如果您进行 java Thread Dump,那
么将看不到该线程)。

在使用 Weblogic Server 的情况下,如果此错误是由某个执行线程抛出的,则会处理此错误并将其记录在日志中。如果连续抛出此错误,
那么核心运行状况监视器线程将关闭 Weblogic Server。

如果 JVM 无法获得更多本地内存,它将抛出本地内存不足(本地 OOM)错误。当进程到达操作系统的进程大小限值,或者当计算机用完
RAM 和交换空间时,通常会发生这种情况。当发生这种情况时,JVM 处理本地 OOM 状态,记录说明它已用完本地内存或无法获得内存的
消息,然后退出。如果 JVM 或加载的任何其它模块(如 libc 或第三方模块)不处理这个本地 OOM 状态,那么操作系统将给 JVM 发送
命令 JVM 退出的 sigabort 信号。通常情况下,JVM 收到 sigabort 信号时将会生成一个核心文件。


排除故障的步骤:
确定是 Java OOM 还是本地 OOM:
如果 stdout/stderr 消息说明这是一个 java.lang.OutOfMemoryError,那么这就是 Java OOM
如果 stdout/stderr 消息说明无法获得内存,那么这就是本地 OOM
请注意,上述消息仅发送到 stdout 或 stderr 中,而不发送到应用程序特定的日志文件(如 weblogic.log)


对于 Java OOM,收集和分析 verbose:gc 输出 在 java 命令行中添加“-verbose:gc”标志。这样将会把 GC 活动信息打印到
stdout/stderr。将 stdout/stderr 重定向到一个文件。运行应用程序,直到该问题重现。 确保 JVM 在抛出 java OOM 之
前完成下列任务,执行一次完整 GC 运行,并且删除了所有不可及对象以及虚可及、弱可及、软可及对象,并回收了那些空间。
有关不同级别的对象可及性的详细信息,可以在以下网址中可找到:
http://java.sun.com/developer/technicalArticles/ALT/RefObj
您可以检查是否在发出 OOM 消息之前执行了完整 GC 运行。当完成一次完整 GC 运行时,将会打印类似如下消息(格式取决
于 JVM - 请查看 JVM 帮助信息以了解有关格式)
[memory ] 7.160: GC 131072K->130052K (131072K) in 1057.359 ms
以上输出的格式如下(备注:在此模式下将全部使用相同的格式):
[memory ] <start>: GC <before>K-><after>K (<heap>K), <total> ms
[memory ] <start> - start time of collection (seconds since jvm start)
[memory ] <before> - memory used by objects before collection (KB)
[memory ] <after> - memory used by objects after collection (KB)
[memory ] <heap> - size of heap after collection (KB)
[memory ] <total> - total time of collection (milliseconds)

但是,没有办法断定是否使用 verbose 消息删除了软/弱/虚可及的对象。如果您怀疑在抛出 OOM 时这些对象仍然存在,请
与 JVM 供应商联系。

如果垃圾回收算法是一种按代回收算法(对于 Jrockit 为 gencopy 或 gencon,对于其它 JDK 则是缺省算法),您也将看
到类似如下的 verbose 输出:
[memory ] 2.414: Nursery GC 31000K->20760K (75776K), 0.469 ms
以上是 nursery GC(即 young GC)周期,它将把活动对象从 nursery(或 young 空间)提升到 old 空间。这个周期对我
们的分析不重要。有关按代回收算法的详细信息,可以在 JVM 文档中找到。
如果在 java OOM 之前未发生 GC 周期,那么这是一个 JVM 错误。

完全压缩:
确保 JVM 执行了适当的压缩工作,并且内存并未成碎片(否则会阻止分配大对象并触发 java OOM 错误)。
Java 对象要求内存是连续的。如果可用空闲内存是一些碎片,那么 JVM 将无法分配大对象,因为它可能无法放入任何可用
空闲内存块中。在这种情况下,JVM 将执行一次完全压缩,以便形成更多连续的空闲内存来容纳大对象。
压缩工作包括在 java 堆内存中将对象从一个位置移动到另一个位置,以及更新对这些对象的引用以指向新位置。除非确有
必要,否则 JVM 不会压缩所有对象。这是为了减少 GC 周期的暂停时间。
我们可以通过分析 verbose gc 消息来检查 java OOM 是否由碎片引起。如果您看到类似如下的输出(在此无论是否有可用
的空闲 java 堆都会抛出 OOM),那么这就是由碎片引起的。

[memory ] 8.162: GC 73043K->72989K (131072K) in 12.938 ms
[memory ] 8.172: GC 72989K->72905K (131072K) in 12.000 ms
[memory ] 8.182: GC 72905K->72580K (131072K) in 13.509 ms
java.lang.OutOfMemoryError
在上述情况中您可以看到,所指定的最大堆内存是 128MB,并且当实际内存使用量仅为 72580K 时,JVM 抛出 OOM。堆使用量
仅为 55%。因此在这种情况下,碎片影响是:即使还有 45% 的空闲堆,内存也会抛出 OOM。这是一个 JVM 错误或缺陷。您应
当与 JVM 供应商联系。

如果 JVM 一切都正常(上一步中提到的所有操作),那么此 java OOM 可能是应用程序的问题。应用程序可能在不断泄漏一些
java 内存,而这可能导致出现上述问题。或者,应用程序使用更多的活动对象,因此它需要更多 java 堆内存。在应用程序中
可以检查以下方面: 应用程序中的缓存功能 - 如果应用程序在内存中缓存 java 对象,则应确保此缓存并没有不断增大。对
缓存中的对象数应有一个限值。我们可以尝试减少此限值,来观察其是否降低 java 堆使用量。 Java 软引用也可用于数据缓存,
当 JVM 用完 java 堆时,可以保证删除软可及对象。

长期活动对象 - 如果应用程序中有长期活动对象,则可以尝试尽可能减少这些对象的存在期。例如,调整 HTTP 会话超时值将
有助于更快地回收空闲会话对象。
内存泄漏 - 内存泄漏的一个例子是在应用服务器中使用数据库连接池。当使用连接池时,必须在 finally 块中显式关闭 JDBC
语句和结果集对象。这是因为,当从池中调用连接对象上的 close() 时,只是简单地把连接返回池中以供重用,并没有实际关闭
连接和关联的语句/结果集对象。

增加 java 堆 - 如果可能的话,我们也可尝试增加 java 堆,以观察是否能解决问题。

如果上述建议都不适用于该应用程序,那么,我们需要使用一个基于 JVMPI(JVM 事件探查器接口)的事件探查器(如 Jprobe 或
OptimizeIt)来找出哪些对象正在占用 java 堆。事件探查器还提供 java 代码中正在创建这些对象的位置的详细信息。本文档并
不介绍每个事件探查器的详细信息。可以参考事件探查器文档来了解如何用事件探查器设置和启动应用程序。一般而言,基于 JVMPI
 的事件探查器需要较高的系统开销,并会大大降低应用程序的性能。因此,在生产环境中使用这些事件探查器并不可取。
http://www.borland.com/optimizeit
http://www.quest.com/jprobe

对于本地 OOM 问题:
收集下列信息: .verbosegc 输出,通过它可监视 java 堆使用量。这样将有助于了解此应用程序的 java 内存要求。
应当注意,指定的最大堆内存量(在 java 命令行中使用 Xmx 标志)与应用程序的实际 java 堆使用量无关,其在 JVM 启动时被保留,
并且此保留内存不能用于其它任何用途。

在使用 Jrockit 时,使用 -verbose 来代替 -verbosegc,因为这可以提供 codegen 信息以及 GC 信息。
定期记录进程虚拟内存大小,从启动应用程序时起直到 JVM 用完本地内存。这样将有助于了解此进程是否确实达到该操作系统的大小限
值。在 Windows 环境下,使用下列步骤来监视虚拟进程大小:
在“开始” -> “运行”对话框中,输入“perfmon”并单击“确定”。
在弹出的“性能”窗口中,单击“+”按钮(图表上部)。
在显示的对话框中选择下列选项:
性能对象:进程(不是缺省的处理器)
从列表中选择计数器:虚拟字节数
从列表中选择实例:选择 JVM (java) 实例
单击“添加”,然后单击“关闭”
在 Unix 或 Linux 环境下,对于一个给定 PID,可以使用以下命令来查找虚拟内存大小 - ps -p <PID> -o vsz。

在 Linux 环境下,单个 JVM 实例内的每个 java 线程都显示为一个独立的进程。如果我们获得根 java 进程的 PID,那么这就足够了。
可以使用 ps 命令的 .forest 选项来找到根 java 进程。例如,ps lU <user> --forest 将提供一个由指定用户启动的所有进程的 ASCII
树图。您可以从该树图中找到根 java。

计算机中的内存可用性
如果计算机没有足够的 RAM 和交换空间,则操作系统将不能为此进程提供更多内存,这样也会导致内存不足。请确保 RAM 与磁盘中的交换
空间之和足以满足该计算机中正在运行的所有进程的需要。

调整 java 堆
如果 java 堆使用量完全在最大堆范围内,则减小 java 最大堆将为 JVM 提供更多的本地内存。这不是一个解决办法,而是一个可尝试的变
通方法。由于操作系统限制进程大小,我们需要在 java 堆和本地堆之间寻求一个平衡。
JVM 的本地内存使用量
在加载了所有类并调用了方法(代码生成结束)后,JVM 的本地内存用量预计将会几乎达到稳定。对于大多数应用程序而言,这通常发生在
最初几小时内。此后,JVM 可能会因加载运行时类型、生成优化代码等处理而仅使用少量本地内存。

为了缩小问题的范围,可尝试禁用运行时优化,并检查这是否会产生任何效果。

在使用 Jrockit 时,可使用 -Xnoopt 标志来禁用运行时优化。

在使用 SUN hotspot JVM 时,-Xint 标志将强迫 JVM 在解释模式中运行(不生成代码)。
如果在整个运行过程中,本地内存使用量继续不断增加,那么这可能是本地代码中的内存泄漏。

第三方本地模块或应用程序中的 JNI 代码
检查您是否在使用类似数据库驱动程序的任何第三方本地模块。这些本地模块也可以分配本地内存,泄漏可能从这些模块中发生。为了缩
小问题的范围,应尝试在没有这些第三方模块的情况下重现问题。例如,可以使用纯 java 驱动程序来代替本地数据库驱动程序。

检查应用程序是否使用一些 JNI 代码。这也可能造成本地内存泄漏,如果可能的话,您可以尝试在没有 JNI 代码的情况下运行应用程序。

如果在执行上述步骤后还不能找到本地内存泄漏的根源,那么您需要与 JVM 供应商合作来获得一个特殊的编译版本,它可以跟踪本地内存
分配调用,并可提供有关泄漏的更多信息。

Jrockit 特定特性
Jrockit 81SP1 和更高版本支持 JRA 记录(Java 运行时间分析器)。这对于收集 JVM 运行时的信息很有用,将提供应用程序的有关信息,
例如,正在运行的 GC 数、软/弱/虚引用的数目、热方法,等等。如果 JVM 出现性能问题或挂起问题,那么用几分钟进行记录和分析数据
就会很有用。有关详细信息,可以在 Jrockit 文档中找到。
http://e-docs.bea.com/wljrockit/docs142/userguide/jra.html


如果您已经理解这个模式,但仍需要其它帮助,您可以:
http://support.bea.com 上查询 AskBEA(例如使用“out of memory”),以查找其它已发布的解决方案。
http://support.bea.com 上,向 BEA 的某个新闻组中提出更详细具体的问题。
如果这还不能解决您的问题,并且您拥有有效的技术支持合同,您可以通过登录以下网站来打开支持案例:http://support.bea.com
 

posted @ 2005-12-21 21:48 java小记 阅读(409) | 评论 (0)编辑 收藏

修改 windows: mysql-root/my.ini  (mysql-4.1.14-win32.zip)
     linux:   /etc/my.cnf
将其中的default-character-set都改成gbk
也就是如下两个SECTION
[client] 
。。。。
default-character-set=gbk
。。。。


[mysqld]
。。。。
default-character-set=gbk
。。。。


Linux上:
mysql> show variables like "%set%";
+--------------------------+----------------------------------------------------
----------------------+
| Variable_name            | Value
                      |
+--------------------------+----------------------------------------------------
----------------------+
| character_set_client     | gbk
                      |
| character_set_connection | gbk
                      |
| character_set_database   | gbk
                      |
| character_set_results    | gbk
                      |
| character_set_server     | gbk
                      |
| character_set_system     | utf8
                      |
| character_sets_dir       | /usr/local/mysql-standard-4.1.12-pc-linux-gnu-i686/
share/mysql/charsets/ |
+--------------------------+----------------------------------------------------
----------------------+
7 rows in set (0.00 sec)
此时可以查看中文的字段,应该一切正常显示。如果不正常显示说明数据库中存放的不是正确编码。


Windows上:
mysql> show variables like "%set%";
+--------------------------+--------------------------+
| Variable_name            | Value                    |
+--------------------------+--------------------------+
| character_set_client     | latin1                   |
| character_set_connection | latin1                   |
| character_set_database   | gbk                      |
| character_set_results    | latin1                   |
| character_set_server     | gbk                      |
| character_set_system     | utf8                     |
| character_sets_dir       | D:\MySql\share\charsets/ |
+--------------------------+--------------------------+
7 rows in set (0.00 sec)

不知道为什么在windows上my.ini中
[client]
。。。。
default-character-set=gbk
没有起作用。

Windows上登录mysql,更改会话的编码为gbk

mysql> set names "gbk";
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like "%set%";
+--------------------------+--------------------------+
| Variable_name            | Value                    |
+--------------------------+--------------------------+
| character_set_client     | gbk                      |
| character_set_connection | gbk                      |
| character_set_database   | gbk                      |
| character_set_results    | gbk                      |
| character_set_server     | gbk                      |
| character_set_system     | utf8                     |
| character_sets_dir       | D:\MySql\share\charsets/ |
+--------------------------+--------------------------+
7 rows in set (0.00 sec)

此时可以查看中文的字段,应该一切正常显示。如果不正常显示说明数据库中存放的不是正确编码。


完全备份MySql
Linux上:
  mysqldump  --user=myname --password=mypassword  mydb >mydb_backup.sql
Windows上:
 Linux上:
  mysqldump   --default-character-set=gb2312 --user=myname --password=mypassword  mydb >mydb_backup.sql

Windows脚本自动登陆
D:\MySql\bin>mysql  --user=myname  --password=mypassword   --default-character-set=gbk   --host=192.168.0.17

posted @ 2005-12-20 15:56 java小记 阅读(550) | 评论 (0)编辑 收藏

项目中需要对安全问题引起足够的重视,比如下列tomcat的安全问题容易被忽略:
 
server.xml默认有下面一行:
<Server port="8005" shutdown="SHUTDOWN">
这样允许任何人只要telnet到服务器的8005端口,输入"SHUTDOWN",然后回车,服务器立即就被关掉了。
从安全的角度上考虑,我们需要把这个shutdown指令改成一个别人不容易猜测的字符串。
例如修改如下:
<Server port="8006" shutdown="lizongbo">,这样就只有在telnet到8006,并且输入"lizongbo"才能够关闭Tomcat.
注意:这个修改不影响shutdown.bat的执行。运行shutdown.bat一样可以关闭服务器。

 

参考Tomcat安全文档英文链接:http://jakarta.apache.org/tomcat/faq/security.html#8005
还有两个问题需要注意:
1、  对于tomcat3.1中,屏蔽目录文件自动列出的方法是什么?
缺省情况下,如果你访问tomcat下的一个web应用,那么如果你输入的是一个目录名,而且该目录下没有一个可用的welcome文件,那么tomcat会将该目录下的所有文件列出来,如果你想屏蔽这个缺省行为,那么可以修改conf/web.xml文件,将其中的:
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
修改为:
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>


2、 如何让Tomcat记录客户端的访问日志 
下面是Tomcat相关手册中的介绍:
以下是引用来自 的内容:
Valve (功能与Logger差不多,其prefix和suffix属性解释和Logger 中的一样) className 指定Valve使用的类名,
如用org.apache.catalina.valves.AccessLogValve类可以记录应用程序的访问信息 directory 指定log文件存放
的位置 pattern 有两个值,common方式记录远程主机名或ip地址,用户名,日期,第一行请求的字符串,HTTP响
应代码,发送的字节数。combined方式比common方式记录的值更多 

所以需要完成的步骤:
   1。修改Tomcat的conf/server.xml文件。
   2。加上Valve节点到server.xml文件中,和您目前使用的Connector的节点平级。
      如:<Valve className="org.apache.catalina.valves.AccessLogValve"
      directory="e:\trs\trscds\tomcat\logs" pattern="combined"/>
   3。重新启动您的Tomcat
   4。有用户在访问的时候,在指定的log目录下面会生成一个access_log文件(每天一个)。
上述的步骤是以Tomcat4.x为例。(可能会影响性能,不推荐大家使用)。

 

还有一个问题:需要处理好Tomcat管理台的安全。
Tomcat管理台的应用文件,默认在{Tomcat安装目录}\server\webapps下,有admin和manager两个应用。
其用户密码,在{Tomcat安装目录}\conf/tomcat-users.xml中定义。在{Tomcat安装目录}\webapps下
admin.xml和manager.xml文件定义了可以通过访问/admin和/manager进入。
默认情况下,完全可以登录tomcat管理台,造成严重安全问题
检测办法:用IE打开链接http://[IP]:[Port]/admin,以用户名admin,密码为空登录,如果成功,
说明存在问题。
解决办法:可以删除{Tomcat安装目录}\webapps下admin.xml和manager.xml文件,或者去掉用户密
码,也可以删除应用文件。


我们一个用户提到如果找不到网页即出现404错误,会显示服务器版本号,服务器配置也一目了然,
为了避免这种情况,希望自定义设置错误页面。
设置如下:
1、将附件的index.htm文件拷贝至\webapps\ROOT目录内,删除或改名原来的index.jsp文件。
2、用记事本打开\conf\web.xml文件,在文件的倒数第二行(</web-app>一行之前)加入以下内容:
       <error-page> 
        <error-code>404</error-code>
        <location>/index.htm</location> 
      </error-page>


 

posted @ 2005-12-20 15:54 java小记 阅读(443) | 评论 (0)编辑 收藏

默认安装tomcat5然后在catalina.bat最前面加入set JAVA_OPTS=-Xms128m -Xmx350m 如果用startup.bat启动tomcat,OK设置生效.够成功的分配200M内存.

但是如果不是执行startup.bat启动tomcat而是利用windows的系统服务启动tomcat服务,上面的设置就不生效了,就是说set JAVA_OPTS=-Xms128m -Xmx350m 没起作用.上面分配200M内存就OOM了..

windows服务执行的是bin\tomcat.exe.他读取注册表中的值,而不是catalina.bat的设置.

解决办法:
修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Tomcat Service Manager\Tomcat5\Parameters\JavaOptions
原值为
-Dcatalina.home="C:\ApacheGroup\Tomcat 5.0"
-Djava.endorsed.dirs="C:\ApacheGroup\Tomcat 5.0\common\endorsed"
-Xrs

加入 -Xms300m -Xmx350m 
重起tomcat服务,设置生效.

posted @ 2005-12-20 11:58 java小记 阅读(3290) | 评论 (0)编辑 收藏


 JVM(java虚拟机)其实就是操作系统(如windows)上的一个普通程序(进程名叫java,这个程序可以解释执行class文件)。
 当java进程启动时会首先分配一块堆内存(最小内存),以后每当class字节码程序要求JVM(java进程)分配内存时,JVM
 就会在预先分配的那块内存上面为class字节码程序分配内存,当预先分配的那块内存用没时,JVM会再向操作系统要内存
 (物理内存), 但是JVM不会无限制的向操作系统要内存,当它占用的实际堆内存达到一个预定值(最大可用内存)时,
 如果class字节码程序还向JVM要内存,并且JVM无法通过回收当前堆中的内存来为class字节码程序服务时,它就会给程
 序抛出java.lang.OutOfMemoryError。其中内存回收时机并不是再用掉内存达到最大可用内存时才进行,他的运行时机是
 不确定的,可见JVM的最大可用内存就是你的java程序(class字节码程序)能够使用的最大内存。
 例如:你把jvm最大可用内存设为200M,而你的物理内存1G.在这种程序下你的class程序最多能使用200M内存,虽然你可能
 还有800M内存可用,但是当你的程序用掉200M后如果再要内存,JVM不会因为你还有800M内存而为你分配内存,他会向你抛
 出java.lang.OutOfMemoryError .
 所以JVM最大可用内存参数比较重要。
 
 一般建议堆的最大值设置为可用内存的最大值的80%。
 
 
 (以下为转网络)
 Tomcat默认可以使用的内存为64MB,在较大型的应用项目中,这点内存是不够的,需要调大。
 Windows下,在文件{tomcat_home}/bin/catalina.bat,Unix下,在文件{tomcat_home}/bin/catalina.sh的前面,
 增加如下设置:
 set JAVA_OPTS=-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】
 需要把这个两个参数值调大。例如: set JAVA_OPTS=-Xms64m -Xmx256m
 表示初始化内存为256MB,可以使用的最大内存为512MB。
 
 另外需要考虑的是Java提供的垃圾回收机制。虚拟机的堆大小决定了虚拟机花费在收集垃圾上的时间和频度。收集垃圾可
 以接受的速度与应用有关,应该通过分析实际的垃圾收集的时间和频率来调整。如果堆的大小很大,那么完全垃圾收集就
 会很慢,但是频度会降低。如果你把堆的大小和内存的需要一致,完全收集就很快,但是会更加频繁。调整堆大小的的目
 的是最小化垃圾收集的时间,以在特定的时间内最大化处理客户的请求。在基准测试的时候,为保证最好的性能,要把堆
 的大小设大,保证垃圾收集不在整个基准测试的过程中出现。
 如果系统花费很多的时间收集垃圾,请减小堆大小。一次完全的垃圾收集应该不超过 3-5 秒。如果垃圾收集成为瓶颈,那
 么需要指定代的大小,检查垃圾收集的详细输出,研究 垃圾收集参数对性能的影响。一般说来,你应该使用物理内存
 的 80% 作为堆大小。当增加处理器时,记得增加内存,因为分配可以并行进行,而垃圾收集不是并行的。


-Xms : 应用程序初始化内存大写,注意是你的某一个应用程序,多个应用程序将生成多个JVM实例
-Xmx:  应用程序占用内存的最大值,将不能超过这个值,否则可能导致OutOfMemory.
-XX:NewRatio  old generation/new generation 的比例

推荐的-Xms -Xmx设置成一样,,为系统内存的80%.这样,不用每次GC清理完再重新分配.
而-XX:NewRatio为2  比如: -Xms384m -Xmx384m -XX:NewRatio=2

posted @ 2005-12-19 18:42 java小记 阅读(1889) | 评论 (0)编辑 收藏
仅列出标题
共4页: 上一页 1 2 3 4 下一页 

<2025年4月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

常用链接

留言簿(1)

随笔分类

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜