zoukankan      html  css  js  c++  java
  • JBoss

    $JBOSS-HOME/server/下有3个目录,all/default/minimal,它们是表示3种配置,全部的配置、默认配置、最小配置,我们在启动JBOSS服务时,可以指定

    run –c all 表示是启动all配置(将会加载所有服务);run 表示是以默认配置启动;

    run –c mimimal  表示是启动mimimal配置。这三者所加载的服务数量不同,具体区别可查阅JBOSS相关文档,你还可以自己定义一个配置,如test

    如果采取默认配置的话,JVM默认只能分配到最大64M内存(默认大小和JVM版本有关系),这在生产环境里肯定是不够,将会导致用户通过WEB方式无法访问应用服务,但是系统进程中,JBOSS服务却没有宕掉的奇怪现象。
    修改$jboss/bin/run.conf文件,找到“#JAVA_OPTS=”,如果没有该字符串,请添加,并去掉最前面的“#”,修改该字符串(含双引号)为JAVA_OPTS="-server -Xms512m -Xmx1024m”,这是分配JVM的最小和最大内存,取决于硬件物理内存的大小,建议均设为物理内存的一半。

    Eclipse启动Jboss服务器指定JVM虚拟内存

    window——preferences——Myeclipse——servers——JBoss5.x——JDK
    右边有个Optional java VM arguments:你加上参数就行了
    -Xms1024m -Xmx1024m
     
     
    使用myeclipse启动两个SSH2的部署在tomcat6下的项目
    报出java.lang.OutOfMemoryError: PermGen space
    解决办法:

    在myeclipse中加大jvm内存方法:
    Window->Preferences->Myeclipse->Services->Tomcat->Tomcat 6.x->JDK,在Optional Java VM arguments:下边的输入框里输入:
    -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=128m

    上边的数值看起来不大,但是我的项目运行很稳定了,可以先不要急着改掉上边的数值,先用上边的数值运行试试,如果还是溢出的话再适当调整

    下边是直接调整jdk/jre的jvm的方式
    Window->Preferences->Java->Installed JREs,在右侧双击当前使用的jdk/jre,在Default VM Arguments中输入
    -Xms128m -Xmx512m

    另外在tomcat中可以随时查看jvm的占用情况.
     
     

    巧借MyEclipse设置JVM突破内存限制

    本文将介绍如何对付MyEclipse内存不足的问题,这里将涉及MyEclipse设置JVM内存的方法。希望这些对大家有作用。

    AD:

    如果没有进行设置的话,在使用MyEclipse的经常出现如下图所示内存不足的提示。

    提示中说的很明白:“MyEclipse has detected that less than 5% of the 64MB of Perm Gen (Non-heap memory) space remains.”意思是说当前只有小于5%的非堆内存是空闲的。所以我们只要将这个值设置大一些就可以了。

    提示中给出了MyEclipse设置JVM的参数:

    -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M

    这里有几个MyEclipse设置JVM问题:

    1. 各个参数的含义什么?

    2. 为什么有的机器我将-Xmx和-XX:MaxPermSize都设置为512M之后Eclipse可以启动,而有些机器无法启动?

    3. 为何将上面的参数写入到eclipse.ini文件Eclipse没有执行对应的设置?

    下面我们一一进行回答

    1. 各个参数的含义什么?

    参数中-vmargs的意思是设置JVM参数,所以后面的其实都是JVM的参数了,我们首先了解一下JVM内存管理的机制,然后再解释每个参数代表的含义。

    堆(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 后调整堆的大小。
    非堆内存分配

    JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。

    JVM内存限制(最大值)

    首先JVM内存限制于实际的最大物理内存(废话!呵呵),假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制,这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制了。
    2. 为什么有的机器我将-Xmx和-XX:MaxPermSize都设置为512M之后Eclipse可以启动,而有些机器无法启动?

    通过上面对JVM内存管理的介绍我们已经了解到JVM内存包含两种:堆内存和非堆内存,另外JVM最大内存首先取决于实际的物理内存和操作系统。所以说设置VM参数导致程序无法启动主要有以下几种原因:

    1) 参数中-Xms的值大于-Xmx,或者-XX:PermSize的值大于-XX:MaxPermSize;

    2) -Xmx的值和-XX:MaxPermSize的总和超过了JVM内存的最大限制,比如当前操作系统最大内存限制,或者实际的物理内存等等。说到实际物理内存这里需要说明一点的是,如果你的内存是1024MB,但实际系统中用到的并不可能是1024MB,因为有一部分被硬件占用了。

    3. 为何将上面的参数写入到eclipse.ini文件Eclipse没有执行对应的设置?

    那为什么同样的参数在快捷方式或者命令行中有效而在eclipse.ini文件中是无效的呢?这是因为我们没有遵守eclipse.ini文件的设置规则:

    参数形如“项 值”这种形式,中间有空格的需要换行书写,如果值中有空格的需要用双引号包括起来。比如我们使用-vm C:Javajre1.6.0injavaw.exe参数设置虚拟机,在eclipse.ini文件中要写成这样:

    -vm
    C:Javajre1.6.0injavaw.exe
    按照上面所说的,最后参数在eclipse.ini中可以写成这个样子:

    1. -vmargs   
    2. -Xms128M   
    3. -Xmx512M   
    4. -XX:PermSize=64M   
    5. -XX:MaxPermSize=128M  

    实际运行的结果可以通过Eclipse中“Help”-“About Eclipse SDK”窗口里面的“Configuration Details”按钮进行查看。

    另外需要说明的是,Eclipse压缩包中自带的eclipse.ini文件内容是这样的:

    1. -showsplash   
    2. org.eclipse.platform   
    3. --launcher.XXMaxPermSize   
    4. 256m   
    5. -vmargs   
    6. -Xms40m   
    7. -Xmx256m  

    其中–launcher.XXMaxPermSize(注意最前面是两个连接线)跟-XX:MaxPermSize参数的含义基本是一样的,我觉得唯一的区别就是前者是eclipse.exe启动的时候设置的参数,而后者是Eclipse所使用的JVM中的参数。其实二者设置一个就可以了,所以这里可以把–launcher.XXMaxPermSize和下一行使用#注释掉。通过MyEclipse设置JVM避免内存不足的问题就介绍到这里。

    Java虚拟机(JVM)中的内存设置详解

    本文向您介绍在Java虚拟机,即JVM中如何设置内存,达到良好的GC效率。

    AD:

    在一些规模稍大的应用中,Java虚拟机(JVM)的内存设置尤为重要,想在项目中取得好的效率,GC(垃圾回收)的设置是第一步。

    PermGen space:全称是Permanent Generation space.就是说是永久保存的区域,用于存放Class和Meta信息,Class在被Load的时候被放入该区域Heap space:存放Instance。

    GC(Garbage Collection)应该不会对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误

    Java Heap分为3个区
    1.Young
    2.Old
    3.Permanent

    Young保存刚实例化的对象。当该区被填满时,GC会将对象移到Old区。Permanent区则负责保存反射对象,本文不讨论该区。

    JVM的Heap分配可以使用-X参数设定,

    -Xms
    初始Heap大小

    -Xmx
    java heap最大值 

    -Xmn
    young generation的heap大小

    JVM有2个GC线程
    第一个线程负责回收Heap的Young区
    第二个线程在Heap不足时,遍历Heap,将Young 区升级为Older区

    Older区的大小等于-Xmx减去-Xmn,不能将-Xms的值设的过大,因为第二个线程被迫运行会降低JVM的性能。
    为什么一些程序频繁发生GC?

    有如下原因:
    1.程序内调用了System.gc()或Runtime.gc()。
    2.一些中间件软件调用自己的GC方法,此时需要设置参数禁止这些GC。
    3.Java的Heap太小,一般默认的Heap值都很小。
    4.频繁实例化对象,Release对象 此时尽量保存并重用对象,例如使用StringBuffer()和String()。

    如果你发现每次GC后,Heap的剩余空间会是总空间的50%,这表示你的Heap处于健康状态,许多Server端的Java程序每次GC后最好能有65%的剩余空间

    经验之谈:

    1.Server端JVM最好将-Xms和-Xmx设为相同值。为了优化GC,最好让-Xmn值约等于-Xmx的1/3。
    2.一个GUI程序最好是每10到20秒间运行一次GC,每次在半秒之内完成。

    注意:

    1.增加Heap的大小虽然会降低GC的频率,但也增加了每次GC的时间。并且GC运行时,所有的用户线程将暂停,也就是GC期间,Java应用程序不做任何工作。
    2.Heap大小并不决定进程的内存使用量。进程的内存使用量要大于-Xmx定义的值,因为Java为其他任务分配内存,例如每个线程的Stack等。

    Stack的设定
    每个线程都有他自己的Stack。

    -Xss
    每个线程的Stack大小

    Stack的大小限制着线程的数量。如果Stack过大就好导致内存溢漏。-Xss参数决定Stack大小,例如-Xss1024K。如果Stack太小,也会导致Stack溢漏。

    硬件环境

    硬件环境也影响GC的效率,例如机器的种类,内存,swap空间,和CPU的数量。
    如果你的程序需要频繁创建很多transient对象,会导致JVM频繁GC。这种情况你可以增加机器的内存,来减少Swap空间的使用。

    4种GC

    1、第一种为单线程GC,也是默认的GC,该GC适用于单CPU机器。
    2、第二种为Throughput GC,是多线程的GC,适用于多CPU,使用大量线程的程序。第二种GC与第一种GC相似,不同在于GC在收集Young区是多线程的,但在Old区和第一种一样,仍然采用单线程。-XX:+UseParallelGC参数启动该GC。
    3、第三种为Concurrent Low Pause GC,类似于第一种,适用于多CPU,并要求缩短因GC造成程序停滞的时间。这种GC可以在Old区的回收同时,运行应用程序。-XX:+UseConcMarkSweepGC参数启动该GC。
    4、第四种为Incremental Low Pause GC,适用于要求缩短因GC造成程序停滞的时间。这种GC可以在Young区回收的同时,回收一部分Old区对象。-Xincgc参数启动该GC。

    单文件的JVM内存进行设置

    默认的java虚拟机的大小比较小,在对大数据进行处理时java就会报错:java.lang.OutOfMemoryError。
    设置jvm内存的方法,对于单独的.class,可以用下面的方法对Test运行时的jvm内存进行设置。
    java -Xms64m -Xmx256m Test
    -Xms是设置内存初始化的大小
    -Xmx是设置最大能够使用内存的大小(最好不要超过物理内存大小)

    tomcat启动jvm内存设置

    Linux:

    在/usr/local/apache-tomcat-5.5.23/bin目录下的catalina.sh添加:JAVA_OPTS='-Xms512m -Xmx1024m'要加“m”说明是MB,否则就是KB了,在启动tomcat时会报内存不足。
    -Xms:初始值
    -Xmx:最大值
    -Xmn:最小值Windows
    在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 omcat.exe.他读取注册表中的值,而不是catalina.bat的设置.解决办法:

    修改注册表HKEY_LOCAL_MACHINESOFTWAREApache Software FoundationTomcat Service ManagerTomcat5ParametersJavaOptions

    原值为

    -Dcatalina.home="C:ApacheGroupTomcat 5.0"
    -Djava.endorsed.dirs="C:ApacheGroupTomcat 5.0commonendorsed"
    -Xrs加入 -Xms300m -Xmx350m

    重起tomcat服务,设置生效

    weblogic启动jvm内存设置

    在weblogic中,可以在startweblogic.cmd中对每个domain虚拟内存的大小进行设置,默认的设置是在commEnv.cmd里面。

    JBoss

    默认可以使用的内存为64MB
    $JBOSSDIR$/bin/run.config
    JAVA_OPTS = "-server -Xms128 -Xmx512"

    Eclipse

    在所在目录下,键入
    eclipse.exe -vmargs -Xms256m -Xmx512m
    256m表示JVM堆内存最小值
    512m表示JVM堆内存最大

    Websphere

    进入控制台去设置:应用程序服务器 > server1 > 进程定义 > Java 虚拟机

    "could not create the java virtual machine"启动eclipse报错

          今天准备使用eclipse写python脚本,刚启动eclipse,“啪”弹出一个messagebox,报错“could not create the java virtual machine ”,晕了,前段时间还用它写过程序,怎么突然出这种错误,打开任务管理器一看,因为开了几个VS2005,内存已经被消耗得差不多了,本来2048M的内存,现在只剩下700多M了,难道是内存不够,java虚拟机创建失败?

          打开到eclipse安装文件夹下的eclipse.ini文件,内容如下:

    -vmargs
    -Xms512M
    -Xmx1024M
    -XX:PermSize=64M
    -XX:MaxPermSize=128M


          暂时不知道什么意思,但是知道是控制eclipse内存消耗的,修改如下:

    -vmargs
    -Xms128M
    -Xmx512M
    -XX:PermSize=64M
    -XX:MaxPermSize=128M

          再次启动eclipse,可以了,惊叹,这些参数分别是什么意思呢?google一下:

          -vmargs是表示下面是设置JVM(java虚拟机)的参数,也就是说下面都是java虚拟机的参数,对于JVM来说,内存分为堆内存和非堆内存,注意这里的堆不是c/c++里面的堆的概念,因为jvm自己管理内存,所谓堆上的内存就是jvm可以分配给java应用程序使用的内存,由-Xms和-Xmx这两个参数限定,而非堆内存则是JVM自己使用的,由-XX:PermSize和-XX:MaxPermSize这两个参数来限定。对于堆内存来讲,JVM根据剩余的堆内存的多少调整整个堆内存的大小,调整范围就是-Xms(最小)和-Xmx(最大)指定的范围,-XX:PermSize和-XX:MaxPermSize也是同样的道理,如果你不想JVM来动态调整的话,可以把最大和最小值设置相等,默认最小值是物理内存的1/64,最大值是物理内存的1/4,所以这个最大值就受到物理内存的限制(当然还会收到操作系统的限制)。

          经过实验发现,如果-Xms的值比-Xmx设置的大则启动会失败;而如果-Xmx和-XX:MaxPermSize设置的值的和比可用的物理内存还大,启动也会失败,我的第一个设置,两者的和超过了1G,而当时可用内存才700M,所以启动会失败,JVM在启动时会检测参数和实际可用内存。

  • 相关阅读:
    <C> 链表 双向链表 栈 队列
    <C> 结构体
    <C> getchar()函数 如何把getchar()到的字符串存起来的实际应用
    DataSet转换为泛型集合和DataRow 转成 模型类
    对DataSet,DataRow,DateTable转换成相应的模型
    Json对象与Json字符串互转(4种转换方式)
    Android开发 使用HBuilder的缓存方法
    MIT_AI公开课p1p2学习笔记
    LeetCode_02 两数相加【链表】
    leetcode_01两数之和
  • 原文地址:https://www.cnblogs.com/firstdream/p/4996553.html
Copyright © 2011-2022 走看看