在hotspot/src/share/vm/runtime/globalshpp以及各组件、平台相关的_gloabalshpp有这些VM参数的声明,然后在对应的cpp文件里有它们的实现。
在product build中,被宏展开之后实际上会变成:
在JavaMain()函数中会创建虚机:
创建虚拟机的函数中,首先会进行虚拟机参数解析并设置好相应的全局变量的值,例如UseParallelGC。然后在init_globals()中就会根据UseParallelGC在创建堆设置好GC回收策略。
parse_each_vm_init_arg会遍历获取到的参数列表,然后根据各参数进行相应的设置和赋值。-XX:+UseParallelGC最后会调用process_argument(tail, args->ignoreUnrecognized, origin)进行设置。
Flag的数据结构(runtime/globashpp):
flagTable这个Flag数组记录了VM参数的名字与存储位置(地址)之间的对应关系。于是通过它就可以实现从字符串到实际全局变量的赋值。
遍历flagTable找到名字所指定的Flag:
然后通过Flag里记录的地址给VM参数对应的全局变量赋值:
在Universe::create_heap()中会根据前面解析出来的堆相关参数,进而创建所需要的堆,并设置相应的GC回收策略。
查找"JavaMain"在哪个文件中:
grep -rn "JavaMain" jdk/src/
查找"Threads::create_vm"方法在哪个文件中:
grep -rn "Threads::create_vm" hotspot/
查找Arguments::parse
查找"Universe::initialize_heap"
以上就是关于Java堆栈溢出的机制与原理全部的内容,包括:Java堆栈溢出的机制与原理、GC的过程、如何在win7下的eclipse中调试Hadoop2.2.0的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)