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而言,将参数配置在任何一个环境变量中都是可以生效的。
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而言,将参数配置在任何一个环境变量中都是可以生效的。
相关文章推荐
- XP下使用虚拟机安装配置Solaris[多图]
- Java 6 JVM参数选项大全(中文版)
- VirtualBox虚拟机XP与宿主机Ubuntu互访共享文件夹
- Linux下三大免费桌面虚拟机评测
- 动易2006序列号破解算法公布
- Flex 性能优化常用手法总结
- oracle 性能优化建议小结
- MySQL性能优化 出题业务SQL优化
- C#数据结构与算法揭秘二
- SQL SERVER性能优化综述(很好的总结,不要错过哦)第1/3页
- 浅析STL中的常用算法
- 解析C语言中位字段内存分配的问题
- android 使用虚拟机安装apk(图文教程)
- dedecms负载性能优化实例,三招让你的dedecms快10倍以上第1/2页
- C#字符串内存分配与驻留池学习分享
- JavaScript 组件之旅(二)编码实现和算法
- jQuery 性能优化手册 推荐
- jQuery 性能优化指南(2)
- jQuery 性能优化指南(3)
- Flex 编程注意之性能优化、垃圾回收的一些总结