Jvm内存机制:

为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能。

整体来划分,整个java内存划分为堆区和方法区。有没有被使用

Java堆在虚拟机启动时创建,主要目的是存放对象实例。细分分为年轻代和老年代。其中年轻代又分为一个eden区和2个survivor区(s0from,s1to)。对象只会存在于Eden区和名为“From”的Survivor区。Eden区中所有存活的对象都会被复制到“To”,而在“From”区中,仍存活的对象会根据他们的年龄值来决定去向。年龄达到一定值(年龄阈值,可以通过-XX:MaxTenuringThreshold来设置,默认15)的对象会被移动到年老代中,没有达到阈值的对象会被复制到“To”区域。经过这次GC后,Eden区和From区已经被清空。这个时候,“From”和“To”会交换他们的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎样,都会保证名为To的Survivor区域是空的。Minor GC会一直重复这样的过程,直到“To”区被填满(达到年龄阈值的时候),“To”区被填满之后,会将所有对象移动到年老代中。

年老代内存里包含了长期存活的对象和经过多次Minor GC后依然存活下来的对象。通常会在老年代内存被占满时进行垃圾回收。老年代的垃圾收集叫做Major GC。Major GC会花费更多的时间。

年轻代的对象临时对象比较多,执行起来非常快,Minor GC会检查所有存活的对象,可能出现响应时间长,应尽量减少。所以要优化。

-Xms设置JVM启动时堆的初始化大小。
-Xmx设置堆最大值。
-Xmn设置年轻代的空间大小,剩下的为老年代的空间大小。
-XX:PermGen设置非堆区内存的初始化大小。
-XX:MaxPermGen设置非堆区的最大值。
-XX:SurvivorRatio提供Eden区和survivor区的空间比例。比如,如果年轻代的大小为10m并且VM开关是-XX:SurvivorRatio=2,那么将会保留5m内存给Eden区和每个Survivor区分配2.5m内存。默认比例是8。
-XX:NewRatio提供年老代和年轻代的比例大小。默认值是2。

Catalina.out  /startup.sh

或者是在起服务的地方。

export CATALINA_OPTS=”$CATALINA_OPTS

-Dcom.sun.management.jmxremote=true //设置访问权限

-Djava.rmi.server.hostname=172.16.205.37 //ip

-Dcom.sun.management.jmxremote.port=9999 //配置的端口号

-Dcom.sun.management.jmxremote.ssl=false //jconsole的远程加密

-Dcom.sun.management.jmxremote.authenticate=false”//为false时不需要输入用户名和密码

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

Captcha Code