JVM Internal 一 性能优化

阅读更多

 

1:大对象可以直接进入old区,多大的对象?大于eden区的剩余空间的对象直接进入old区域。

  1. -Xms20M -Xmx20M -Xmn10M -XX:SurvivorRatio=8  
  2. eden区8M,from和to各1M,old区10M,总共20M的空间

用参数-XX:PretenureSizeThreshold=3145728 控制。

 注意:PretenureSizeThreshold参数只对Serial和ParNew两款收集器有效,Parallel Scavenge收集器不认识这个参数,Parallel Scavenge收集器一般并不需要设置。如果遇到必须使用此参数的场合,可以考虑ParNew加CMS的收集器组合。

2:性能优化需要注意的地方:

 

Finalizers: don;t do it!需要2个gc cicle,gc循环会变慢?在对象销毁的时候,最好用方法

释放资源,如果不可以,用soft reference,最好也别用?否则会导致更多更长时间的垃圾收集暂停。

 

class ClassWithFinalizer{
    protected void finalize(){}
}

class MyClass extends ClassWithFinalizer
{
      private byte[] buffer  = new byte[2014*1024*5];
}

 最好写成

Class MyClass {
   private ClassWithFinalizer classWithFinalizer;
   private byte[] buffer  = new byte[1024*1024*5]
}

 在此处有好几个性能优化的案例都是由于 Finalizer 方法使用不当导致的很严重的性能问题。

 

 内部类的使用问题,inner class have a implicit reference to the outer class

增长了对象的生命周期,延迟了垃圾回收的时间??

 

二:Jvm的内存使用

jvm采用分代内存管理,分为 

Young Generation --gc比较频繁,采用Copy算法

+Eden

+From Survivor

+To  Survivor

Old Generation  --gc较少,采用标记 收集 压缩的算法

Permanent Generation,存放方法和常量,如果常量迟无限增大,也会触发垃圾回收,(Full GC)。

 

由于堆内存是被所有进程共享的,新分配的对象要加锁,如果分配的对象比较小,就先分配到线程自己的缓冲中分配(?待确认),如果在Young Genration中分配的话就分配在eden区,如果Eden区域没有空间了,就gc一次,将存活的对象copy到 From和To中的一个,如果还是空间不足,就再gc一次,将From区域存活的对象copy到 To区域,将其中存活过一定时间的对象copy到Old区,将Eden区域的对象copy到To区域,如此循环,From和To总有一个是空的

如果Old区域也满了,就会出发Full Gc了。

 

 

32bit的cPU 有4g内存给java程序,其中有一个部分被OS和C runtime占用,剩下的部分是userspace

 

 三:内存区域控制常用的参数

 

 -Xmx -- Heap区域的最大值,默认为1G

-Xms --heap区域初始化的时候的大小,默认为系统的1/64,不超过1G。如果当前的空余堆内存比例小于40%(见-XX:MinHeapFreeRatio)系统会将堆内存扩大到最大值。通常-Xmx和-Xms设置为一样的值,免得内存来回变动损耗性能

-XX:PermSize --设置方法区的初始化值,默认为系统的1/64

-XX:MinHeapFreeRatio——设置Heap区域最小空闲值,用于控制何时将堆内存扩大至最大值,通常是40%

-XX:MaxHeapFreeRatio——设置Heap区域最大空闲值,用于控制何时将对内存缩小至初始值,通常是70%

-XX:NewRatio——设置Heap区域中new和old代大小的比例,值就是年轻代内存大小/年老代内存大小。

-XX:SurvivorRatio——设置Survivor区域和Eden区域的比例,值就是Eden区域大小/Survivor区域大小

 

引用:

 

HotSpot VM里Java程序通过JNI调用C函数的流程

Java虚拟机规范

The Law of Leaky Abstractions

by Joel Spolsky

Java InstanceOf 的具体实现

http://www.artima.com/insidejvm/ed2/security2.html

 阅读OpenJdk代码

 

语法分析

 

bison的运算符优先级一例

虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩

Bson手册

javascript学习

DLR

https://kenai.com/hg/maxine~maxine/file/213118b238e8/mxmaxine

 Davik Internal

你可能感兴趣的:(JVM Internal 一 性能优化)