java内存模型分析-java虚拟机栈最大深度问题与优化
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)
4453
Java对象的创建Java是一门面向对象的编程语言,在Java程序运行过程中无时无刻都有对象被创建出来。在语言层面上,创建对象(例如克隆、反序列化)通常仅仅是一个new关键字而已,而在虚拟机中,对象
blog
Java内存区域与内存溢出异常
java基础
3751
拟机规范》中,对这个内存区域规定了两类异常状况:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果Java虚拟机栈容量可以动态扩展[2],当栈扩展时无法申
blog
jvm内存模型分析(1)
java虚拟机(jvm)
3028
jvm内存模型分析(1)Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域jvm包括三大子系统:类加载子系统,运行时数据区(内存结构),执行引擎详细图示
java虚拟机(jvm)
3574
jvm内存模型分析(5)堆内存溢出以及分析1.模拟堆内存溢出代码packagetest;importjava.util.ArrayList;importjava.util.List
java虚拟机(jvm)
2239
jmap是java虚拟机自带的一种内存映像工具,我们可以通过该工具配合不同的参数来查看java虚拟机内存的详细信息(如程序中出现的所有对象的数量以及占用内存大小等),以及通过虚拟机内存的使用情况来定
java虚拟机(jvm)
2463
这里以HotSpot为例,且所说的对象指普通的Java对象,不包括数组和Class对象等。参考资料深入理解java虚拟机《周志明》1.对象的内存布局HotSpot虚拟机中,对象在内存中存储的布局可以
java虚拟机(jvm)
1598
jvm内存模型分析-垃圾收集器和内存分配策略(1)说起垃圾收集(GarbagcCollcction,GC),大部分人都把这项技术当做java语言的伴生产物。事实上,GC的历史比Java久远,1960
ofc
Java内存区域与内存溢出异常
official
878
《深入理解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
2024-08
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
加密算法
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。