01__JVM(2)线程私有部

2019-05-25  本文已影响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
上一篇 下一篇

猜你喜欢

热点阅读