java内存模型分析-java虚拟机栈最大深度问题与优化

硅谷探秘者 6813 0 0
Java虚拟机栈都包含那些东西

        在阅读过深入理解java虚拟机以后了解到java虚拟机栈包括栈帧、局部变量表、操作数栈、动态链接、方法返回等。

Java虚拟机栈都储存那些内容呢

        一般包括基本数据类型,和对象的指针引用,所以一般这部分使用的内存相对较小,而且当方法调用完成以后栈帧中占用的内存即可被回收。

影响java虚拟机栈最大深度的因素有那些

        1.Java虚拟机栈的大小直接影响栈的深度
        2.在java虚拟机栈的大小一定的情况下,栈帧的内容(主要是变量的个数和类型)越多,栈的深度就会越小。

在栈大小一定的时候观察以下几个方法执行时栈的深度
public class A4 {
	private static int depth=0;
	public static void main(String[] args) {
		try {
			recursion();
		} catch (Throwable e) {
			System.out.println("递归深度:"+depth);
		}
	}
	public static void recursion() {
		depth++;
		recursion();
	}
}
//输出:递归深度:24138

         加入局部变量以后

public class A4 {
	private static int depth=0;
	public static void main(String[] args) {
		try {
			recursion();
		} catch (Throwable e) {
			System.out.println("递归深度:"+depth);
		}
	}
	public static void recursion() {
		depth++;
		int a=0;
		double b=999999999999999999999999D;
		recursion();
	}
}
//输出:递归深度:23329

        加入形式参数以后

public class A4 {
	private static int depth=0;
	public static void main(String[] args) {
		try {
			recursion(999999999,99999999,99999999);
		} catch (Throwable e) {
			System.out.println("递归深度:"+depth);
		}
	}
	public static void recursion(int x,int y,int z) {
		depth++;
		int a=0;
		double b=999999999999999999999999D;
		recursion(x,y,z);
	}
}
//输出:递归深度:19159
如何修改java虚拟机栈的大小

配置java运行时的参数-Xss,Xss 是指设定每个线程的堆栈大小。

执行:java -Xss2m a/A4,输出:递归深度:40901

执行:java -Xss4m a/A4,输出:递归深度:84856

执行:java -Xss8m a/A4,输出:递归深度:172708

可以看出指定的java虚拟机栈的内存越大,栈的深度就越大。但是一般情况下256k可以满足绝大部分需求。


评论区
请写下您的评论...
暂无评论...
猜你喜欢
java虚拟机(jvm) 4193 Java对象的创建Java是一门面向对象的编程语言,在Java程序运行过程中无时无刻都有对象被创建出来。在语言层面上,创建对象(例如克隆、反序列)通常仅仅是一个new关键字而已,而在中,对象
java基础 3508 规范》中,对这个区域规定了两类异常状况:如果线程请求的所允许的,将抛出StackOverflowError异常;如果Java容量可以动态扩展[2],当扩展时无法申
java虚拟机(jvm) 2823 jvm(1)Java在执行Java程序的过程中会把它所管理的为若干个不同的数据区域jvm包括三子系统:类加载子系统,运行时数据区(结构),执行引擎详细图示
java虚拟机(jvm) 3316 jvm(5)堆溢出以及1.溢出代码packagetest;importjava.util.ArrayList;importjava.util.List
java虚拟机(jvm) 1948 jmap是java自带的一种映像工具,我们可以通过该工具配合不同的参数来查看java的详细信息(如程序中出现的所有对象的数量以及占用小等),以及通过的使用情况来定
java虚拟机(jvm) 2212 这里以HotSpot为例,且所说的对象指普通的Java对象,不包括数组和Class对象等。参考资料入理解java《周志明》1.对象的布局HotSpot中,对象在储的布局可以
java虚拟机(jvm) 1371 jvm-垃圾收集器和配策略(1)说起垃圾收集(GarbagcCollcction,GC),人都把这项技术当做java语言的伴生产物。事实上,GC的历史比Java久远,1960
official 722 入理解java》[TOC]一、运行时数据区域  Java在执行Java程序的过程中会把它所管理的为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁的时间,有的区域随
归档
2018-11  12 2018-12  33 2019-01  28 2019-02  28 2019-03  32 2019-04  27 2019-05  33 2019-06  6 2019-07  12 2019-08  12 2019-09  21 2019-10  8 2019-11  15 2019-12  25 2020-01  9 2020-02  5 2020-03  16 2020-04  4 2020-06  1 2020-07  7 2020-08  13 2020-09  9 2020-10  5 2020-12  3 2021-01  1 2021-02  5 2021-03  7 2021-04  4 2021-05  4 2021-06  1 2021-07  7 2021-08  2 2021-09  8 2021-10  9 2021-11  16 2021-12  14 2022-01  7 2022-05  1 2022-08  3 2022-09  2 2022-10  2 2022-12  5 2023-01  3 2023-02  1 2023-03  4 2023-04  2 2023-06  3 2023-07  4 2023-08  1 2023-10  1 2024-02  1 2024-03  1 2024-04  1
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio mysql ensp 网络基础 xxl-job rabbitmq haproxy srs 音视频 webrtc javascript
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。