美文网首页
虚拟机实验(六)观察虚拟机栈

虚拟机实验(六)观察虚拟机栈

作者: 杭州痞老板 | 来源:发表于2018-04-18 23:18 被阅读0次

jdk1.5前,默认Xss256k,jdk1.5后默认Xss1m

实验前:对于虚拟机栈的理解

  • 虚拟机中每一个线程栈都有一个固定的大小,这个大小的值由Xss参数制定
  • 假设进程里有n个线程,那么整个虚拟机栈总共占用了 n*Xss的内存,这个是从这n个线程已启动就已经分配好了

实验后:对于虚拟机栈的理解

  • 每次创建一个帧栈时,并不会为其直接分配Xss大小的内存,并且不是刚创建帧栈时如果机器内存不够Xss的大小就报OOM
  • Xss只是一个阈值,表示的是一个帧栈的最大可用内存
  • 每个栈实际占用内存都是动态地按需分配,线程一帧需要多少内存就分配相应或稍多的内存,但整个帧栈大小不会超过Xss这个阈值,否则报StackOverFlowError

实验代码

/**
 * VM Args: -Xss1g -Xmx40g -Xms40g
 * @author JohnLiu
 */
public class StackOOM { 
    public void stackLeakByThread(){
        int num=20;
        //启动20个线程
        while(num>0){
            new Thread(new Runnable(){
                public void run(){
                    endlessWork(0);
                }
            }).start();;
            num--;
        }
    }
    public void endlessWork(int count){
        System.out.println(Thread.currentThread().getName()+"-"+count);
        // 1G的栈下 基本上一千万次调用会发生StackOverFlowError,为了保守起见,设置只递归调用8000000次
        if(count<=8000000){
            endlessWork(++count);
        }else{
            //防止出现 stackOverFlowError
            while(true){
                
            }
        }
    }
    public static void main(String[] args) {
        new StackOOM().stackLeakByThread();
    }
}

实验结果

本机内存为47G, 20个线程一起创建后,如果每个线程一创建就分配Xss的空间,那么:堆空间+20个栈的空间=40g+20g=60g>47g,程序不可能会启动成功,但是这个程序能成功启动,并且最后的输出日志如下:

Thread-7-785683
Thread-7-785684
Thread-7-785685
Thread-7-785686
Thread-7-785687
Thread-7-785688
Thread-7-785689
Thread-7-785690
Thread-7-785691
Thread-7-785692
Thread-7-785693
Thread-14-741123
Thread-14-741124
Thread-14-741125
#
[thread 30788 also had an error]# There is insufficient memory for the Java Runtime Environment to continue.

[thread 31128 also had an error]
# Native memory allocation (malloc) failed to allocate 2832 bytes for AllocateHeap
# An error report file with more information is saved as:
# D:\export\hs_err_pid30696.log
[CodeBlob (0x0000000042ff0790)]
Framesize: 0
BufferBlob (0x0000000042ff0790) used for StubRoutines (1)

相关文章

  • 虚拟机实验(六)观察虚拟机栈

    jdk1.5前,默认Xss256k,jdk1.5后默认Xss1m 实验前:对于虚拟机栈的理解 虚拟机中每一个线程栈...

  • 每天五道Android面试题,轻松进大厂2018-12-19

    一、java虚拟机和Dalvik虚拟机的区别 Java虚拟机: 1、java虚拟机基于栈。基于栈的机器必须使用指令...

  • 虚拟机栈

    虚拟机栈是线程私有的,每创建一个线程,虚拟机就会为这个线程创建一个虚拟机栈,虚拟机栈表示Java方法执行的内存模型...

  • 小白懂JVM系列-运行时数据区之虚拟机栈

    虚拟机栈 Java虚拟机栈(Java Virtual Machine Stack),早期也叫Java栈。每个线程在...

  • 本地方法栈

    本地方法栈 和虚拟机栈所发挥的作用非常相似,区别是: 虚拟机栈为虚拟机执行 Java 方法 (也就是字节码)服务,...

  • 【Java虚拟机】垃圾收集器与内存分配1

    Java虚拟机运行时数据区:方法区、堆、虚拟机栈、本地方法栈、程序计数器. 对于线程私有的虚拟机栈、本地方法栈、程...

  • java类文件

    一、定义 虚拟机栈 虚拟机栈代表是线程维度,一个线程有且只有一个虚拟栈。虚拟机栈存储的单位是栈帧,而一个栈帧包含了...

  • java虚拟机第八章之运行时栈桢结构

    栈桢是用于虚拟机进行方法调用和方法执行时的数据结构,它是虚拟机运行时数据区虚拟机栈的栈元素。栈元素存储了方...

  • 1.1 数据结构

    虚拟机的结构 一共有虚拟机栈,本地方法栈,堆,方法区(永久区),直接内存 一、虚拟机栈:也叫作局部变量表,包含:八...

  • 虚拟机栈中都有什么?

    虚拟机栈中都有什么? Java虚拟机栈(Java Virtual Machine Stacks) 是线程私有的,它...

网友评论

      本文标题:虚拟机实验(六)观察虚拟机栈

      本文链接:https://www.haomeiwen.com/subject/fbzbkftx.html