JVM学习1.0
Posted 小胡的技术之路
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM学习1.0相关的知识,希望对你有一定的参考价值。
Java虚拟机内存模型是Java程序运行的基础。为了能使Java应用程序正常运行,JVM虚拟机将其内存数据分为程序计数器、虚拟机栈、本地方法栈、java堆和方法区等部分
程序计数器用于存放下一条运行的指令:虚拟机栈和本地方法栈用于存放函数调用堆栈信息;Java堆用于存放Java程序运行时所需的对象等数据;方法区用于存放程序的类元数据等。
程序计数器是一块很小的内存空间。由于Java是支持线程的语言,当线程数超过CPU数量时,线程之间根据时间片轮询抢夺CPU资源。对于单核CPU来说,每一时刻,只能有一个线程在运行,而其他线程必须被切换出去。为此,每一个线程都必须用一个独立的程序计数器。用于记录下一条要运行的指令。各个线程之间的计数器互不影响,独立工作;是一块线程私有的内存空间。
Java虚拟机栈也是线程私有的内存空间,它和Java线程在同一时间创建,它保存方法的局部变量、部分结果,并参与方法的调用和返回。
Java虚拟机规范允许Java栈的大小是动态的或者是固定的。在Java虚拟机规范中,定义了两种异常和栈空间有关:StockOverfolwError和OutOfMemoryError。如果线程在计算过程中,请求的栈深度大于最大可用栈深度,则抛出StockOverfolwError;如果Java栈可以动态扩展,而在扩展的过程中,没有足够的内存空间来支持栈的扩展,则抛出OutOfMemoryError。
在Hot Spot虚拟机中,可以使用-Xss参数来设置栈的大小。栈的大小直接决定了函数调用的可达深度
代码展示递归调用应用
结果:
如果系统需要支持更深的栈调用,可以使用-Xss1M运行程序,扩大栈空间的最大值
修改方法如下:
打开eclipse window-preferences-Java -Installed JREs -Edit -Default VM Arguments
在VM自变量中输入:-Xmx128m -Xms64m -Xmn32m -Xss16m【数值根据自己需要修改】
运行程序:
程序支持的函数调用深度明显上升。
函数嵌套调用的次数由栈的大小。栈越大,函数嵌套调用次数越多。对一个函数而言,它的参数越多,内部局部变量越多,它的栈帧就越大,而其嵌套调用次数就会减少
2
使用参数-Xss1M运行程序
函数调用次数由无参时的67531下降到 11627
以上是关于JVM学习1.0的主要内容,如果未能解决你的问题,请参考以下文章
JVM 内存结构 -- 什么是JVM学习JVM的好处学习路线(JVM的组成)程序计数器虚拟机栈(栈内存溢出线程运行诊断)