深入理解JVM

本文详细解读了JVM运行时数据区的组成与作用,包括Heap、MethodArea、VMStack等区域的功能及它们之间的区别。同时,文章阐述了JVM的时间消耗分析,包括编译时间、垃圾收集时间等关键因素。此外,还探讨了GC策略与避免运行时自动扩展的方法,并介绍了JVM上多线程的实现原理。最后,文章通过Jetty在分配Acceptor时的算法说明了实际应用中的多线程策略。
1、JVM运行时数据区
[img]http://g.hiphotos.bdimg.com/album/pic/item/6c224f4a20a4462327c89b929a22720e0cf3d73b.jpg[/img]
>>>解释如下:

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));
==>理论上真正并行线程数不超过内核数;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值