如露亦如电

一切有为法,如梦幻泡影,如露亦如电,应作如是观

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  370 随笔 :: 0 文章 :: 0 评论 :: 0 引用

Weblogic 集群搭建

Oracle的Weblogic分开发者版本和生产版本,有32位和64位。一般生产版本的weblogic是64位的,安装文件是一个大小为1G多的jar包。

去oracle官网上下载64版weblogic。这里使用的版本是weblogic11g,版本号是10.3.6,文件名为“wls1036_generic.jar”。安装weblogic前要确认已安装好jdk(如果安装的是64位weblogic则需要64位版本的jdk)。

目前,weblogic可免费使用,需要oracle的weblogic服务时才需要向Oracle付费买服务,即产品免费服务收费。

安装weblogic(windows和Linux操作步骤相同) 
1、在命令行,进入安装文件wls1036_generic.jar所在文件夹 
然后输入命令: Java -jar wls1036_generic.jar 
点击回车后程序会启动weblogic安装文件的图形安装界面。 

按下来的安装和在windows中安装普通文件一样了。 
2、点击“下一步”,到下图界面,然后输入weblogic的安装目录。(路径中最好不要有空格)

3、点击“下一步”。到下图界面,由于我们没有购买oracle的服务所以去掉下图中的勾。(目前weblogic可免费使用,需要oracle技术支持的话才需要付费) 

4、点击“下一步”,到下图界面,会因为我们没有填写上图的的支持信息而弹出两个警告框,直接“YES”通过即可。进入下图,勾选下面的框(不需要使用验证) 

 

5、然后点击“继续”。到下图界面,选择“典型”和“定制”都可以,根据自己喜好设置 

6、选择后点击“下一步”,进入下图界面,如果没有显示jdk信息,则手动点击“浏览”选择自己机器上安装的jdk,一般默认显示出来的就已经是自己机口上安装的了

(貌似是根据环境变量里的JAVA_HOME获取的)

环境变量一定需要设置仔细,不然这里不能自动获取

7、点击“下一步”进入下图界面,不用修改,直接点击“下一步”即可 

8、然后会显示出我们准备安装的组件信息,直接点击“下一步” 

9、然后就开始安装了

10、安装完成了,这里有勾选“运行 Quickstart”表示安装完成后打开域创建和配置界面。点击“完成”按钮完成weblogic主程序的安装 

域创建及配置(这里只创建集群管理端,节点稍后在控制台的页面上创建) 
如果步骤一中完成安装时有勾选“运行Quickstart”则接着会直接打开域创建和配置界面。如果没有勾“运行Quickstart”,则我们在文件夹(根据自己的安装路径找到对应的位置) 
D:\Program_Files\Oracle\Middleware\wlserver_10.3\common\bin 
下面,双击config.cmd文件启动域创建和配置界面(linux系统则是双击运行config.sh文件) 
这里写图片描述 
1、如上图所示,选择“创建新的WebLogic域”,然后点击“下一步” 
这里写图片描述

2、如上图所示,默认即可,点击“下一步” 
这里写图片描述 
3、如上图所示,填写要创建的域的名字,这里名字取为portal_domain;和选择域文件要保存的位置(位置一般默认即可),然后点击“下一步” 
这里写图片描述 
4、如上图所示,设置要创建的域的用户名和密码(注意:要记住该用户名和密码,启动域和登录控制台时都会用到)。然后点击“下一步” 
这里写图片描述 
5、如上图所示。生产环境要选择“生产模式”,选择JDK(“可用JDK”下面的框中一般会显示自己安装的JDK并默认使用这个。貌似是从系统环境变量JAVA_HOME取的值,但没有试验过还不确定。生产环境使用weblogic Jrockit的JDK会获得比较好的性能,根据论坛里的说法,weblogic Jrockit的JDK会比sun的jdk快20%。 不太懂Jrockit Jdk配置,所以这里我们还是用sun的jdk了)。然后点击“下一步” 
这里写图片描述 
6、创建管理端。如上图所示。勾选“管理服务器”,然后点击“下一步”(勾选“管理服务器”表示创建的域为管理服务器,勾选“受管服务器、集群和计算机”表示该域是受管服务器。如果前面两个都勾选上则表示创建的域即含有管理服务器又含有受管服务器。所以这里我们只勾选了“管理服务器”,表示我们要创建的该域仅仅做为管理端使用。创建集群时管理端最好独立出来,因为如果一个域同时包含管理端和受管理端的话,当我们需要重启服务时就会同时重启管理端,这样我们无法在页面的节点管理器里直接启动包含管理端的节点,而管理端独立出来则可以避免这种情况的发生,维护时直接在控制台对节点进行重启就可以了) 
这里写图片描述 
7、如上图所示。为域的管理端填入名称(我们这里使用了默认的AdminServer),“Listen address”默认为监听本机上所有的IP(这里默认即可,一般表示localhost,127.0.0.1或者IPv6中的0:0:0:0:0:0:0:1),“Listen port”表示监听本机的端口,一般大家喜欢把管理端口设置为9001。我们这里不需要SSL加密所以没有勾选该项。然后点击“下一步”(如上图设置,我们本机访问域的控制台的url就是http://localhost:9001/console ,其它机器就访问http://IP地址:9001/console),然后进入到最后的安装确认页面 
这里写图片描述 
8、如上图。点击“创建”开始创建域 
这里写图片描述 
9、如上图所示,点击“完成”完成域管理端的创建。

启动weblogic集群管理端,创建集群,并为集群创建和添加节点。

如果步骤二最后一步中勾选了“启动管理服务端”,则点击完成后会直接启动集群的服务端。如果没有勾选“启动管理服务端”,则我们需要进入路径 
D:\Program_Files\Oracle\Middleware\user_projects\domains\portal_domain\bin 
双击startWebLogic.cmd启动服务(linux系统则是双击运行startWebLogic.sh),启动时需要输入我们前面(步骤二 4中)设置的域的的用户名和密码。 
注:上面路径中portal_domain是我们上面步骤二 3中设置的“域名”,根据自己设置的域名进入对应的路径 
1、如下图所示,启动时会提示输入域的用户名和密码 
这里写图片描述 
2、启动后,打开浏览器,输入http://localhost:7001/console (其中9001是我们步骤二 7中配置的集群管理端的端口号),如下图所示,输入刚才启动时输入的用户名和密码,点击“登录” 
这里写图片描述 
3、进入控制台页面。如下图,点左侧导航树的“环境”-“集群”;然后点击左上角的“锁定服务器”按钮(生产模式需要点击这个按钮才可以对其下的功能进行更新) 

这里写图片描述 
4、如下图所示,点击“新建”按钮来创建一个集群。如下图所示,给集群取个名称,其它的保持默认即可。点击“确定”完成集群的创建。(下面创建节点,并添加到集群中) 
这里写图片描述 
5、如下图,点击“激活更改”按钮把刚才创建的集群保存到weblogic中。 
这里写图片描述 
6、如下图所示。点击左侧树的“环境”- “服务器”。并点击左上角的“锁定并编辑”按钮。点击“新建”按钮创建一个新的节点 
这里写图片描述

7、进入节点创建界面,如下图所示。如下图所示,为节点取个名字,配置节点的端口为7001,单选框选择“应属于, 使此服务器成为某个现有集群的成员”把该节点加入刚才我们创建的集群。然后点击“下一步”进入完成确认页面。 
注:端口7001表示,该节点上服务我们通过7001来访问,对应的URL类似于http://localhost:7001服务路径….。该端口一般是递增的,比如第一个节点配置的端口是7001,那么第二个节点端口一般配置为7002,第三个节点端口配置为7003… 
这里写图片描述 
8、如下图所示。点击“完成”按钮完成节点的创建。 
这里写图片描述 
9、如下图所示。节点创建完成,页面中显示了节点的名称、所属的集群、节点监听的端口号信息。 生产模式中一定不要忘记点击“激活更改”按钮使配置生效 
这里写图片描述 
10、按照上面的方法我们再创建两个节点,并加入集群中。如下图所示,我们创建了一个管理端,和三个节点的集群 
这里写图片描述

启动集群 
到这里集群主要的配置已经完成,集群已经可以正常的启动并工作了。 
(但是这样维护起来会比较麻烦,比如重启节点每次都要登录服务器在命令行中手动启动。配置节点管理器之后,就可以直接在页面控制台上对节点进行停止和启动,详细设置查看“配置节点管理器”小节) 
1、启动集群必需首先启动域的管理端 
(由于我们上面已经启动管理端,所以这里就不再启动了,只把方法列出来)

进入命令行,并进入如下路径(根据自己的安装目录进入对应位置), 
cd D:\Program_Files\Oracle\Middleware\user_projects\domains\portal_domain\bin 
输入如下命令启动weblogic管理端 
startWeblogic.cmd (linux中使用 ./startWeblogic.sh来启动)

2、启动各节点。注:节点的启动必需在管理端启动完成后才能启动。 
进入命令行,并进入如下路径(根据自己的安装目录进入对应位置), 
cd D:\Program_Files\Oracle\Middleware\user_projects\domains\portal_domain\bin 
输入如下 
startManagerWeblogic server_7001 t3://localhost:9001 
(linux中使用 ./startManagerWeblogic server_7001 t3://localhost:9001)

说明:上面的命令中,startManagerWeblogic.cmd 是启动节点的脚本 
(linux中为startManagerWeblogic.sh);server_7001是我们上面创建的节点名称; 
t3://localhost:9001这个表示节点server_7001指向本机(localhost)的管理端,其中的t3是weblogic的协议类似于http。如果管理端不在本机上则这里的localhost换成目标机器IP,端口换成目标机器管理端端口即可。

注意启动节点时会提示输入用户名和密码

3、依次启动各节点。当我们启动完成后再次点击页面控制台左侧树“环境”- “服务器”可以查看到三个节点的状态已经改变为RUNNING, 
这里写图片描述

4、点击左侧导航树的“部署”进入工程部署页面。在这里就可以部署我们的war包或者工程源码了。

配置启动时免输入密码 
当我们第一次启动每一个节点时,weblogic会在 
D:\Program_Files\Oracle\Middleware\user_projects\domains\portal_domain\servers 
目录下创建各节点对应的文件夹(文件夹的名字和节点名相同),如下图。AdminServer是管理端的文件夹,server_7001,server_7002,server_7003分别对应我们创建的三个节点。 
这里写图片描述

1、设置管理端启动时(startWeblogic.cmd启动时)免输入密码 
进入管理端的文件夹 
Cd D:\Program_Files\Oracle\Middleware\user_projects\domains\portal_domain\servers\AdminServer 
在该目录下新建一个名为security的文件夹,进入该文件夹,新建一个名为boot.properties的文件 
即文件boot.properties文件在路径 
D:\Program_Files\Oracle\Middleware\user_projects\domains\portal_domain\servers\AdminServer\security 
下面。文件boot.properties中写入两行 
username=创建域时设置的用户名 
password=创建域时设置的密码 
保存。完成。 
注:再次启动该管理端时boot.properties文件中的用户名和密码会被加密。所以不用担心密码泄露的情况发生 
2、设置节点启动时(startManageWeblogic.cmd server_7001 t3://localhost:9001),免输入密码,这里首先设置名为server_7001节点 
进入管理端的文件夹 
Cd D:\Program_Files\Oracle\Middleware\user_projects\domains\portal_domain\servers\server_7001 
在该目录下新建一个名为security的文件夹,进入该文件夹,新建一个名为boot.properties的文件 
即文件boot.properties文件在路径 
D:\Program_Files\Oracle\Middleware\user_projects\domains\portal_domain\servers\server_7001\security 
下面。文件boot.properties中写入两行 
username=创建域时设置的用户名 
password=创建域时设置的密码 
保存。完成。 
注:再次启动该管理端时boot.properties文件中的用户名和密码会被加密。所以不用担心密码泄露的情况发 
3、按照上面步骤2的方法把节点server_7002、和节点server_7003都设置一下。 
再次启动服务器端或者各节点的时候就不再需要输入用户名和密码了。

配置节点管理器 
节点管理器可以在控制台中对各节点进行关闭和重启,所以需要各节点是免输入密码的,所以进行该步骤配置时需要确定各节点是免输入密码的。具体方法参考“五、配置启动时免输入密码” 
首先关闭各节点。点击左侧导航树“环境”-“服务器”- 主页面“控制”,然后勾选三个节点server_7001、server_7002、server_7003,点击“关闭”-点击“立即强制重启”关闭节点 
这里写图片描述

1、创建计算机 (计算机中有节点管理器)。 
如下图所示点击左侧导航树中的“计算机”,并点击左上角的“锁定并编辑”按钮,并点击中间主页面的“创建”按钮来创建一个计算机 
这里写图片描述 
2、如下图所示。给计算机取个名称(根据自己喜好取,即好容易辨认,比如machine_56)。计算机操作系统选择默认的“其它”。(因为我们的操作系统一般都是linux或者windows,如果是UNIX操作系统则选择UNIX)然后点击“下一步”继续 
这里写图片描述 
3、如下图所示类型选择“普通”,(因为我们没有开户默认的SSL所以这里选择了普通)点击“完成” 
这里写图片描述 
4、如下图所示。先不要点击“激活更改”。在中间的主页面点击刚才创建的计算机名称“machine_localhost” 
这里写图片描述 
5、如下图所示,点击“服务器”菜单,然后再点击下面的“添加”按钮为计算机添加节点(也叫服务器) 
这里写图片描述 
6、如下图所示。单选框选择第一个“选择现有的服务器, 并将它与此计算机关联”,选择服务器一行,先选择管理端“AdminServer”,然后点击“下一步”或者“完成”按钮完成管理端的添加 
这里写图片描述 
7、如下图所示。再次点击“添加”按钮,添加server_7001节点,然后重复该操作把剩下的节点都添加到该计算机中来。 
这里写图片描述 
8、如下图所示。点击“激活更改”完成计算机的创建及配置。 
这里写图片描述 
9、如下图所示。点击左上角“锁定并编辑”按钮进入编辑模式。然后点击左侧导航树“环境”-“服务器”-中间主页面中点击“server_7001” 
这里写图片描述 
10、如下图所示。点击“服务器启动”菜单项。各项参数配置为(根据自己的机器设置对应的路径) 
Java主目录: D:/Program_Files/java/jdk1.6.0_45 
Java供应商: sun 
BEA 主目录: D:/Program_Files/Oracle/Middleware 
根目录: D:/Program_Files/Oracle/Middleware/user_projects/domains/portal_domain 
类路径: D:/Program_Files/Oracle/Middleware/wlserver_10.3/server/lib/weblogic.jar 
参数: (注:参数一栏设置为空) 
安全策略文件: D:/Program_Files/Oracle/Middleware/wlserver_10.3/server/lib/weblogic.policy 
下面的用户名,密码,确认密码,输入创建域时的设置的用户名和密码。然后点击“保存” 
这里写图片描述 
11、如下图所示。点击“激活更改”按钮激活刚才的设置 
这里写图片描述 
12、重复上述操作,完成其它结点的设置。 
13、修改weblogic 节点管理器参数 
首先启动节点管理器,在命令行中进入目录 
D:\Program_Files\Oracle\Middleware\wlserver_10.3\server\bin 
执行脚本startNodeManager.cmd (linux服务器使用脚本startNodeManager.sh),命令为 
startNodeManager.cmd (linux服务器中为 ./startNodeManager.sh) 
启动完成后。关闭它。(启动的目的是让节点管理器生成自己的配置文件,第一次启动时会生成) 
进入文件夹D:\Program_Files\Oracle\Middleware\wlserver_10.3\common\nodemanager 
打开节点管理器配置文件nodemanager.properties, 
把StartScriptEnabled=false这一行修改为StartScriptEnabled=true,(个人理解,意思是weblogic允许通过脚本启动节点)。 
然后再次启动节点管理器 
14、下面我们就可以在控制台的页面上关闭和启动各节点了。如下图所示,点击左侧导航树的“环境”- “服务器”,然后点击中间主页面的“控制”,然后勾选需要启动的节点,然后点击“启动” 
这里写图片描述 
15、如下图所示。点击“是”开始启动节点。 
这里写图片描述 
16、之后我们可以点击左侧导航树的“环境”- “服务器”刷新页面,查看各节点的状态,查看各节点是否完成启动。如下图所示表示各节点完成了启动。 
这里写图片描述 
17、关闭节点。 
点击上图的控制,勾选需要关闭的节点,然后点击“关闭”- “立即强制关闭”可以关闭节点。注意:不要关闭控制端(AdminServer),如果把AdminServer也关闭了,那我们需要登录服务器,手动启动管理端。

另外需要注意的是:我们使用节点管理器全新启动weblogic的时候正确顺序是,先启动管理端(startWeblogic.sh),然后再启动节点管理器(startNodeManager.sh),然后登录控制台启动各节点。

Weblogic的优化

根据weblogic论坛查找到的资料,整理如下。 
1、内存优化 
首先确定JDK支持的内存大小。各个jdk版本在不同操作系统中支持的最大内存是不一样的,但是可以通过以下方法来进行测试。 
java -XmxXXXm(g) -version 
其中,XXX为最大内存数值, m(g)是内存的计量单位,如果命令能够正确显示出jdk的版本等信息,说明当前jdk支持测试的最大内存数量,否则说明测试的内存超出了jdk支持的最大值。 
例如 java -Xmx1024m -version 或者 java -Xmx2g -version 
测试发现一般在32位机器上,windows操作系统该最大值位于1.5G-2G之间,linux操作系统该最大值为2G-3G之间;在64位机器上面应该没啥限制,经测试写64G也能正常得出版本信息

修改方法: 
修改D:/Program_Files/Oracle/Middleware/user_projects/domains/base_domain/bin下的setDomainEnv.cmd文件(linux上修改setDomainEnv.sh): 
修改前:(如下所示,默认的大小为512m) 
if”%JAVA_VENDOR%”==”Sun” ( 
set WLS_MEM_ARGS_64BIT=-Xms256m -Xmx512m 
set WLS_MEM_ARGS_32BIT=-Xms256m -Xmx512m 
) else ( 
set WLS_MEM_ARGS_64BIT=-Xms512m -Xmx512m 
set WLS_MEM_ARGS_32BIT=-Xms512m -Xmx512m 

setMEM_PERM_SIZE_32BIT=-XX:PermSize=48m 
setMEM_MAX_PERM_SIZE_32BIT=-XX:MaxPermSize=128m

修改后:(这里给了它最大4G内存)

if”%JAVA_VENDOR%”==”Sun” ( 
set WLS_MEM_ARGS_64BIT=-Xms3072m –Xmx4096m 
set WLS_MEM_ARGS_32BIT=-Xms1024m –Xmx1536m 
) else ( 
set WLS_MEM_ARGS_64BIT=-Xms3072m –Xmx4096m 
set WLS_MEM_ARGS_32BIT=-Xms1024m –Xmx1536m 

setMEM_PERM_SIZE_32BIT=-XX:PermSize=288m 
setMEM_MAX_PERM_SIZE_32BIT=-XX:MaxPermSize=768m 
说明:具体修改值根据实际物理内存确定 
· -Xmx3550m:设置JVM最大堆内存为3550M。 
· -Xms3550m:设置JVM初始堆内存为3550M。此值可以设置与-Xmx相同,以避免每次JVM动态分配内存所浪费的时间。 
· -XX:PermSize=256M:设置堆内存持久化初始值为256M。(貌似是Eclipse等IDE的初始化参数) 
· -XX:MaxPermSize=512M:设置持久化最大值为512M。 
32位操作JDK内存系统:最大可设置1.5G,如果设置过大,会导致服务无法启动 
64位操作JDK内存系统:最大设置为物理内存的60~80%

关于于JVM内存的一些详细地知识,查看“附录I”

2、设置线程数

修改weblogic\user_projects\domains\base_domain\bin下的setDomainEnv.cmd中 
在JAVA_OPTIONS中添加如下: 
set JAVA_OPTIONS=%JAVA_OPTIONS%-Dweblogic.threadpool.MinPoolSize=2000 
set JAVA_OPTIONS=%JAVA_OPTIONS%-Dweblogic.threadpool.MaxPoolSize=4000 
说明: 
JDK5.0以后每个线程栈大小为1M,但是操作系统对一个进程内的线程数还是有限制的,不能无限生成。32位操作系统根据JVM最大堆内存设置;64位操作系统经验值在3000~5000左右。

3、weblogic文件连接数 
D:\Program_Files\Oracle\Middleware\wlserver_10.3\common\bin(根据自己的机器情况进入对应的路径)路径下的commEnv.cmd (linux服务器为commEnv.sh),文件中的方法resetFd限制了weblogic打开的文件连接数不大于1024,我们把这方法注释掉以去掉这个限制。在文件的最后一行由resetFd修改为#resetFd (#号表示注释)

4、修改linux操作系统的文件句柄数限制(这个未做测试,仅供参考) 
因为linux系统里都是以文件来表示的,所以在做高并发的web系统时,修改文件句柄限制那是必须的。 
查看某个进程使用了的文件句柄数 
# sudo ps -ef | grep java 
root 1663 1 0 02:37 ? 00:00:43 /opt/bitnami/java/bin/java 
从结果中可得知进程的pid,然后根据pid查看该进程当前使用的文件句柄数 
#sudo ls /proc/1663/fd | wc -l 
1022 
发现句柄数一直就停留在1022,同时top查看发现load持续增高。于是先查看了下当前进程的句柄数限制。 
#sudo cat /proc/1663/limits | grep “files” 
Max open files 1024 1024 files 
发现限制卡在这了,于是修改/etc/sysctl.conf文件,添加一行如下: 
fs.file-max=30720 
保存。并执行 
#sudo sysctl -p 
然后再查看就发现已经改过来了。 
Google发现linux系统里有两种文件句柄限制,一种是系统级的,一种是用户级的。 
修改系统级的: www.2cto.com 
#echo “30720” > /proc/sys/fs/file-max 
修改用户级的: 
#sudo vi /etc/security/limits.conf 
增加如下行: 
* soft nofile 2048 
* hard nofile 32768 
星号表示任何用户,soft/hard表示软限制、硬限制。修改/etc/pam.d/login文件指定使用PAM 
session required /lib/security/pam_limits.so 
不过需要注意的是系统是32位还是64位,若是64位的那就是/lib64/security/pam_limits.so 
上面的修改后,reboot,再次查看 
#ulimit -n 
30720 
修改成功。

附录I:关于JVM内存的一些知识

文章来源: http://www.cnblogs.com/mingforyou/archive/2012/03/03/2378143.html

Xms Xmx PermSize MaxPermSize 区别

有时我们会遇到Eclipse崩溃的情况,错误提示像下面这样: 
MyEclipse has detected that less than 5% of the 64MB of Perm 
Gen (Non-heap memory) space remains. It is strongly recommended 
that you exit and restart MyEclipse with new virtual machine memory 
paramters to increase this memory. Failure to do so can result in 
data loss. The recommended Eclipse memory parameters are: 
eclipse.exe -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M

1.参数的含义 
-vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M 
-vmargs 说明后面是VM的参数,所以后面的其实都是JVM的参数了 
-Xms128m JVM初始分配的堆内存 
-Xmx512m JVM最大允许分配的堆内存,按需分配 
-XX:PermSize=64M JVM初始分配的非堆内存 
-XX:MaxPermSize=128M JVM最大允许分配的非堆内存,按需分配

我们首先了解一下JVM内存管理的机制,然后再解释每个参数代表的含义。

1)堆(Heap)和非堆(Non-heap)内存

按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。 
可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的, 
所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中。

堆内存分配

JVM初始分配的堆内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的堆内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制; 
空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx 相等以避免在每次GC 后调整堆的大小。 
说明:如果-Xmx 不指定或者指定偏小,应用可能会导致java.lang.OutOfMemory错误,此错误来自JVM,不是Throwable的,无法用try…catch捕捉。

非堆内存分配

JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。(还有一说:MaxPermSize缺省值和-server -client选项相关, 
-server选项下默认MaxPermSize为64m,-client选项下默认MaxPermSize为32m。这个我没有实验。) 
上面错误信息中的PermGen space的全称是Permanent Generation space,是指内存的永久保存区域。还没有弄明白PermGen space是属于非堆内存,还是就是非堆内存,但至少是属于了。 
XX:MaxPermSize设置过小会导致java.lang.OutOfMemoryError: PermGen space 就是内存益出。 
说说为什么会内存益出: 
(1)这一部分内存用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和存放Instance的Heap区域不同。 
(2)GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS 的话,就很可能出现PermGen space错误。 
这种错误常见在web服务器对JSP进行pre compile的时候。

2)JVM内存限制(最大值)

首先JVM内存限制于实际的最大物理内存,假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制, 
这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制了。

  1. 为什么有的机器我将-Xmx和-XX:MaxPermSize都设置为512M之后Eclipse可以启动,而有些机器无法启动? 
    通过上面对JVM内存管理的介绍我们已经了解到JVM内存包含两种:堆内存和非堆内存,另外JVM最大内存首先取决于实际的物理内存和操作系统。所以说设置VM参数导致程序无法启动主要有以下几种原因: 
    1) 参数中-Xms的值大于-Xmx,或者-XX:PermSize的值大于-XX:MaxPermSize; 
    2) -Xmx的值和-XX:MaxPermSize的总和超过了JVM内存的最大限制,比如当前操作系统最大内存限制,或者实际的物理内存等等。说到实际物理内存这里需要说明一点的是, 
    如果你的内存是1024MB,但实际系统中用到的并不可能是1024MB,因为有一部分被硬件占用了。

  2. 为何将上面的参数写入到eclipse.ini文件Eclipse没有执行对应的设置? 
    那为什么同样的参数在快捷方式或者命令行中有效而在eclipse.ini文件中是无效的呢?这是因为我们没有遵守eclipse.ini文件的设置规则: 
    参数形如“项 值”这种形式,中间有空格的需要换行书写,如果值中有空格的需要用双引号包括起来。比如我们使用-vm C:/Java/jre1.6.0/bin/javaw.exe参数设置虚拟机, 
    在eclipse.ini文件中要写成这样: 
    -vm 
    C:/Java/jre1.6.0/bin/javaw.exe 
    -vmargs 
    -Xms128M 
    -Xmx512M 
    -XX:PermSize=64M 
    -XX:MaxPermSize=128M 
    实际运行的结果可以通过Eclipse中“Help”-“About Eclipse SDK”窗口里面的“Configuration Details”按钮进行查看。 
    另外需要说明的是,Eclipse压缩包中自带的eclipse.ini文件内容是这样的: 
    -showsplash 
    org.eclipse.platform 
    –launcher.XXMaxPermSize 
    256m 
    -vmargs 
    -Xms40m 
    -Xmx256m 
    其中–launcher.XXMaxPermSize(注意最前面是两个连接线)跟-XX:MaxPermSize参数的含义基本是一样的,我觉得唯一的区别就是前者是eclipse.exe启动的时候设置的参数, 
    而后者是eclipse所使用的JVM中的参数。其实二者设置一个就可以了,所以这里可以把–launcher.XXMaxPermSize和下一行使用#注释掉。

  3. 其他的启动参数。 如果你有一个双核的CPU,也许可以尝试这个参数: 
    -XX:+UseParallelGC 
    让GC可以更快的执行。(只是JDK 5里对GC新增加的参数)

补充: 
  如果你的WEB APP下都用了大量的第三方jar,其大小超过了服务器jvm默认的大小,那么就会产生内存益出问题了。 
解决方法: 设置MaxPermSize大小 
可以在myelipse里选中相应的服务器比如tomcat5,展开里面的JDK子项页面,来增加服务器启动的JVM参数设置: 
-Xms128m 
-Xmx256m 
-XX:PermSize=128M 
-XX:MaxNewSize=256m 
-XX:MaxPermSize=256m 
或者手动设置MaxPermSize大小,比如tomcat, 
修改TOMCAT_HOME/bin/catalina.bat,在echo “Using CATALINA_BASE: $CATALINA_BASE”上面加入以下行: 
JAVA_OPTS=”-server -XX:PermSize=64M -XX:MaxPermSize=128m

 
好文要顶 关注我 收藏该文  
posted on 2020-07-18 11:52  ~如露亦如电~  阅读(96)  评论(0编辑  收藏