美文网首页
01__JVM(2)线程私有部

01__JVM(2)线程私有部

作者: 忞触动心灵 | 来源:发表于2019-05-25 16:56 被阅读0次

    线程私有部分(指令区)-----运行时才有

    image

    运行时数据区------内存分配和优化

    运行时分配

    生命周期是跟随线程的

    异常情况

    方法的递归调用

    递归循环
    package testWork;
    
    // -Xss128k 设置虚拟机栈的大小为128k
    
    public class JavaWNStackSOF {
    
        private int stackLongth = 0; //调用方法的次数
        //递归循环
        public void tech() {//只会入栈,不会出栈了.(一次就有一个栈帧)
            stackLongth++;
            //做点其他事
            tech();//再调用一次(不会 出栈)
        }
    
        public static void main(String[] args) throws Throwable {
    
            JavaWNStackSOF oom = new JavaWNStackSOF();
    
            try {
                oom.tech();//调用方法
            }catch (Throwable e) {
                //输出异常时循环次数(不是一个普通的异常)
                System.out.println("栈异常! 调用方法的次数(入虚拟机栈的栈帧次数)."
                +oom.stackLongth);
    
                throw e;
            }
    
        }
    
    }
    
    

    测试

    package testWork;
    
    public class JavaWNStackSOF {
    
        /**
         * Run-->Edit Configurations-->VN Options :设置虚拟机栈内存大小 -Xss128k
         *  -Xss128k 栈异常! 调用方法的次数(入虚拟机栈的栈帧次数).993
         *  -Xss512k 栈异常! 调用方法的次数(入虚拟机栈的栈帧次数).7310
         *  默认大小  栈异常! 调用方法的次数(入虚拟机栈的栈帧次数).24741
         */
        private int stackLongth = 0; //调用方法的次数
        //递归循环
        public void tech() {//只会入栈,不会出栈了.(一次就有一个栈帧)
            stackLongth++;
            //做点其他事
            tech();//再调用一次(不会 出栈)
        }
    
        public static void main(String[] args) throws Throwable {
    
            JavaWNStackSOF oom = new JavaWNStackSOF();
    
            try {
                oom.tech();//调用方法
            }catch (Throwable e) {
                //输出异常时循环次数
                System.out.println("栈异常! 调用方法的次数(入虚拟机栈的栈帧次数)."
                +oom.stackLongth);
    
                throw e;
            }
    
    
        }
    
    }
    

    加局部变量(栈帧中加内容:加大栈帧)

    
     默认大小:    栈异常! 调用方法的次数(入虚拟机栈的栈帧次数).16387
     
     
             int a = 1;
             int b = 2 ;
             int c = ++a+ ++b;
    

    优化策略

    1.调整虚拟机的大小,调大还时调小? (虚拟机栈的大小设置 -Xss512k 默认 1M)

    栈需要调整==小点==

    线程的私有部分(程序计数器,本地方法栈,==虚拟机栈==)----线程运行时才有

    高并发,多线程 : 栈的大小 1M = 1000线程同时运行 * 1M = 1G的运行内存

    一个线程就有一个对应的虚拟机运行栈:一般栈的大小设为128k=1000线程同时运行*128K = 128M

    相关文章

      网友评论

          本文标题:01__JVM(2)线程私有部

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