1、在tomcat/bin目录下进行设置
windows下在catalina.bat文件前加入设置
Linux下在catalina.sh文件前加入设置
JAVA_OPTS=-Xms256m -Xmx512m
注:如果eclispe里也设置了JVM参数,eclipse里的优先级高
JVM整体架构:
主要包括两个子系统和两个组件:Classloader(类装载器)子系统,Executionengine(执行引擎)子系统;Runtimedataarea(运行时数据区域)组件,Nativeinterface(本地接口)组件。
Classloader子系统的作用:根据给定的全限定名类名(如 java.lang.Object)来装载class文件的内容到Runtimedataarea中的methodarea(方法区域)。
Javsa程序员可以extendsjava.lang.ClassLoader类来写自己的Classloader。
Executionengine子系统的作用:执行classes中的指令。
任何JVMspecification实现(JDK)的核心是Executionengine,换句话说:Sun的JDK和IBM的JDK好坏主要取决于他们各自实现的Executionengine的好坏。每个运行中的线程都有一个Executionengine的实例。 Nativeinterface组件:与nativelibraries交互,是其它编程语言交互的接口。
Runtimedataarea主要包括五个部分:
Heap(堆),
MethodArea(方法区域),
JavaStack(java的栈),
ProgramCounter(程序计数器),
Nativemethodstack(本地方法栈)。
Heap和MethodArea是被所有线程的共享使用的;而Java程独自拥有。
Heap
Java程序在运行时创建的所有类实或数组都放在同一个堆中。而一个Java虚拟实例中只存在一个堆空间,因此所有线程都将共享这个堆。每一个java程序独占一个JVM实例,因而每个java程序都有它自己的堆空间,它们不会彼此干扰。但是同一java程序的多个线程都共享着同一个堆空间,就得考虑多线程访问对象(堆数据)的同步问题。(这里可能出现的异常java.lang.OutOfMemoryError:Javaheapspace)
Methodarea
在Java虚拟机中,被装载的class的信息存储在Methodarea的内存中。当虚拟机装载某个类型时,它使用类装载器定位相应的class文件,然后读入这个class文件内容并把它传输到虚拟机中。紧接着虚拟机提取其中的类型信息,并将这些信息存储到方法区。该类型中的类(静态)变量同样也存储在方法区中。与Heap一样,methodarea是多线程共享的,因此要考虑多线程访问的同步问题。比如,假设同时两个线程都企图访问一个名为Lava的类,而这个类还没有内装载入虚拟机,那么,这时应该只有一个线程去装载它,而另一个线程则只能等待。(这里可能出现的异常java.lang.OutOfMemoryError:PermGenfull)
Javastack
Javastack以帧为单位保存线程的运行状态。虚拟机只会直接对Java
stack执行两种操作:以帧为单位的压栈或出栈。每当线程调用一个方法的时候,就对当前状态作为一个帧保存到javastack中(压栈);当一个方法调用返回时,从javastack弹出一个帧(出栈)。栈的大小是有一定的限制,这个可能出现StackOverFlow问题。下面的程序可以说明这个问题。publicclassTestStackOverFlow{
publicstaticvoidmain(String[]args){
Recursiver=newRecursive();r.doit(10000);
//Exceptioninthread"main"
java.lang.StackOverflowError
}}
classRecursive{
publicintdoit(intt){
return1;
}
returnt+doit(t-1);
}}
Programcounter
每个运行中的Java程序,每一个线程都有它自己的PC寄存器,也是该线程启动时创建的。PC寄存器的内容总是指向下一条将被执行指令的饿“地址”,这里的“地址”可以是一个本地指针,也可以是在方法区中相对应于该方法起始指令的偏移量。
Nativemethodstack
对于一个运行中的Java程序而言,它还能会用到一些跟本地方法相关的数据区。当某个线程调用一个本地方法时,它就进入了一个全新的并且不再受虚拟机限制的世界。本地方法可以通过本地方法接口来访问虚拟机的运行时数据区,不止与此,它还可以做任何它想做的事情。比如,可以调用寄存器,或在操作系统中分配内存等。总之,本地方法具有和JVM相同的能力和权限。(这里出现JVM无法控制的内存溢出问题nativeheapOutOfMemory)