深入理解JVM

1、JVM运行时数据区

>>>解释如下:

JVM运行时数据区==>5块==>Heap、MethodArea(RuntimeConstantPool)、VMStack、NativeMethodStack、ProgramCounterRegister
  ==>其中Heap和MethodArea是所有线程共享的;
  ==>而:ProgramCounterRegister、VMStack、NativeMethodStack是线程隔离的,即仅在当前线程范围有效;
  ==>线程开的越多,导致VMStack和NativeMethodStack变大,一个线程对应两个stack,一个VMStack,一个是NativeMethodStack。
【Vip】JVM Memory=>Heap + Non-Heap
       >>Non-Heap=>Non-Heap=MethodArea=>MethodArea=PermGen+CodeCache
       >>Heap=YoungGen + OldGen(TenuredGen)


2、编译器模式:-Xint || -client || -server


3、JVM时间消耗:类加载时间 || 编译时间(ComplieTime) || 垃圾收集时间(GC Time)|| 用户程序时间

==>编译时间:JIT 编译热点代码(Hotspot code)的耗时
==>JIT会将热代码编译为本地代码
==>运行期编译,会占用运行时间
==>运行期动态编译可能优于C/C++的静态编译方式


4、GC:

==>避免运行时自动扩展(-Xms与-Xmx相同 -XX:PermSize与-XX:MaxPermSize相同)


5、JVM上的多线程

==>JVM上的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)只会执行一条线程中的指令。
==>这就是为什么jetty在分配Acceptor时,算法为:setAcceptors(Math.max(1, (Runtime.getRuntime().availableProcessors() + 3) / 4));
==>理论上真正并行线程数不超过内核数;

猜你喜欢

转载自can-do.iteye.com/blog/2245305