jvm的原理及內存優化

来源:互联网 发布:河北seo 编辑:程序博客网 时间:2024/06/10 18:57

-Xms256m -Xmx512m -XX:MaxNewSize=256m -XX:MaxPermSize=256m -Xms512m

由於默认的java虚拟机的大小比较小,在对大数据进行处理时java就会报错:java.lang.OutOfMemoryError。

-Xms是设置内存初始化的大小

-Xmx是JVM内存设置中设置最大能够使用内存的大小

JVM內存調優

1.heap設定與垃圾回收

JavaHeap分为3个区,Young,Old和Permanent。Young保存刚实例化的对象。当该区被填满时,GC会将对象移到Old区。Permanent区则负责保存反射对象。JVM的Heap分配可以使用-X参数设定,

JVM有2个GC线程。

第一个线程负责回收Heap的Young区。

第二个线程在Heap不足时,遍历Heap,将Young区升级为Older区。Older区的大小等于-Xmx减去-Xmn,不能将-Xms的值设的过大,因为第二个线程被迫运行会降低JVM的性能。

2.stack的設定;

Xss每个线程的Stack大小

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

3.4种GC;

第一种为单线程GC,也是默认的GC。,该GC适用于单CPU机器。

第二种为ThroughputGC,是多线程的GC,适用于多CPU,使用大量线程的程序。第二种GC与第一种GC相似,不同在于GC在收集Young区是多线程的,但在Old区和第一种一样,仍然采用单线程。-XX:+UseParallelGC参数启动该GC。

第三种为ConcurrentLowPauseGC,类似于第一种,适用于多CPU,并要求缩短因GC造成程序停滞的时间。这种GC可以在Old区的回收同时,运行应用程序。-XX:+UseConcMarkSweepGC参数启动该GC。

第四种为IncrementalLowPauseGC,适用于要求缩短因GC造成程序停滞的时间。这种GC可以在Young区回收的同时,回收一部分Old区对象。-Xincgc参数启动该GC。

4.硬件环境;

================================================分割线=============================================================================

运行原理:

java编译器将java源文件(.java)编译成面向JVM生成JVM能理解的代码或字节码文件(.class);JVM将每一条指令翻译成不同平台机器码(.exe文件),通过特定平台(os)运行。

JVM的类装载机制:将包含在类文件中的字节码装载到JVM中。(JVM中类的装载是由ClassLoader和它的子类来实现的)

JVM的运行引擎机制:负责执行包含在已装载的类或接口中的指令。

装载:查找和导入类或接口的二进制数据;
链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;
校验:检查导入类或接口的二进制数据的正确性;
准备:给类的静态变量分配并初始化存储空间;
解析:将符号引用转成直接引用;
初始化:激活类的静态变量的初始化Java代码和静态Java代码块。