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

2019 精帖
0 5261

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可以满足绝大部分需求。

留言(0)
猜你喜欢
  • blog 算法-迷宫-广先搜索-队列

    描述思路: 典的广先搜索算法,根据字典序小,可以确定遍历的循序, 因为字典序D<L<R<U, 所以对于每一个节点先先往下走,然后向左走,然后向右走,然后向上走。则后首先到达出口的一条路径就是符合意的短路径。
  • ofc mysql中text类

    mysql中text类
  • blog jvm字节码指令集

    Java的指令由一个字节长的、代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成。基本数据类1、除了long和double类外,每个变量都占局部
  • blog java类加载器理解

    类加载器Java类加载器(英语:Java Classloader)是Java运行时环境(Java Runtime Environment)的一部,负责动态加载Java类到Java空间中。类通常是按需加载,即第一次使用该类时才加
  • blog java异常捕获

    java异常捕获 思考: 调用下面的方法别会返和输出回什么?package com.itdragon.controller;import org.junit.Test;public class TestMain { p
  • blog java类是如何加载的

    首先要知道类的加载的过程包括了加载、验证、准备、解、初始五个阶段。 java加载class的过程         把Class文件加载到,然后进行校验,解和初始终形
  • blog jvm-垃圾收集算法

    1.标记-清除算法         基础的收集算法是“标记-清除”(Mark-Sweep)算法,如同它的名字一样,算法为“标记”和“清
  • blog jvm(3)之局部变量表

    原文:https://blog.csdn.net/wuzhiwei549/article/details/80636404笔记:局部变量表已了解--每个方法在执行的同时都会创建一个帧(Stack Frame)用于储局部变量表、操作数
  • blog 并发编程之-java线程(JMM)和volatile关键字理解

    硬件的效率一致性         在正式讲解Java并发相关的知识之前,我们先花费一点时间去了解一下物理计算中的并发,物理遇到的并发中的情况有不少相似之处,物理对并发的
  • blog java工具 jmap 命令的使用方法以及堆快照的创建及(1)

            jmap是java自带的一种映像工具,我们可以通过该工具配合不同的参数来查看java的详细信息(如程序中出现的所有对象的数量以及占用小等),以及通过