您的位置:首页 > 编程语言 > Java开发

java性能优化笔记 - 03

2014-03-21 13:49 239 查看
19. JVM调优

Java虚拟机内存模型

程序计数器: 存放下一条运行的指令

虚拟机栈,本地方法栈: 存放函数调用堆栈

Java堆: 存放Java程序运行时所需对象等数据

方法区: 存放程序的类元数据信息

①程序计数器

    每一个线程都必须用一个独立的程序计数器,用于记录下一条要运行的指令。各个线程之间的计数器互不影响,

独立工作,是一块线程私有的内存空间。

②Java虚拟机栈

    Java虚拟机栈也是线程私有的内存空间,它和Java线程在同一时间创建,它保存方法的局部变量、部分结果,并

参与方法的调用和返回。

③本地方法栈

    用于管理本地方法的调用。本地方法并不是用Java实现的,而是使用C实现的。

④Java堆

    几乎所有的对象和数组都是在堆中分配空间的。分为新生代与老年代两个部分,新生代用于存放刚刚产生的对象

和年轻的对象。如果对象未被回收而时间较长,进入老年代。

⑤方法区

    方法区也称为永久区,主要存放常量和类的定义信息。回收的基本条件至少有:所有该类的实例被回收,且装载该

类的实例被回收,且装载该类的ClassLoader被回收。

 

20.Java内存分配参数

①使用-Xmx可以设置系统的最大堆。

②JVM会试图将系统内存尽可能限制在-Xms中,因此当内存实际使用量触及-Xms指定的大小时,会触发Full GC.因此

把-Xms值设置为-Xmx时,可以在系统运行初期减少GC的次数和耗时。

③设置新生代

    参数Xmm用于设置新生代的大小,设置一个较大的新生代会减少老年代的大小,这个参数对系统性能及GC行为有

很大的影响。新生代的大小一般设置为整个堆空间的1/4到1/3左右。

④设置持久代(方法区)

    持久代的大小直接决定了系统可以支持多少个类定义和多少常量。对于使用CGLIB或者Javassist等动态字节码生成

工具的应用程序而言,设置合理的持久代大小有助于维持系统的稳定。

⑤设置线程栈

    如果系统确实需要大量线程并发执行,那么设置一个较小的堆和较小的栈,有助于提高系统所能承受的最大线程数。

 

21.垃圾收集基础

①垃圾收集的作用

1) 由于无法处理循环引用的问题,引用计数法不适合用于JVM的垃圾回收。

2)标记-清除算法先通过根节点标记所有的可达对象,然后清除所有不可达的对象,完成垃圾回收。

3)复制算法(适用于新生代,垃圾对象多于存活对象的状态)

将所有的内存空间分为两块,每次不使用其中的一块。在垃圾回收时将正在使用的内存中的存活对象复制到未使用的内

存块中。之后,清除正在使用的内存块中的所有对象,交换两个内存的角色,完成垃圾回收。

4)标记-压缩算法

    清理未标记的对象,而是将所有的存活对象压缩到内存的一端。之后,清理边界外所有的空间。这种方法既避免了碎片

的产生,又不需要两块相同的内存空间。

5)增量算法

    如果一次性奖所有的垃圾进行处理,需要造成系统长时间的停顿,那么就可以让垃圾收集线程和应用程序线程交替执行。

                  | 新生代: 复制算法

内存分代--

                  | 老年代:标记-压缩算法

 

22.常用调优案例和方法

①由于新生代垃圾回收的速度高于老年代回收。因此,将年代对象预留在新生代有利于提高整体的GC效率。

②大对象进入老年代:短命的大对象对垃圾回收是一场灾难。目前没有一种特别好的回收方法处理这个问题。

因此,开发人员应尽量避免使用短命的大对象。

 

23.Tomcat简介与启动加速

在使用startup.bat启动了Tomcat服务器时,startup.bat调用了bin目录下的catalina.bat文件。如果需要配置Tomcat

的JVM参数,可以将参数写入catalina.bat。配置环境变量CATALINA_OPTS或JAVA_OPTS都可以设置Tomcat的

JVM优化参数。就Startup.bat而言,将参数配置在任何一个环境变量中都是可以生效的。

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息