Java线程与Xss

jvm系列

  • 垃圾回收基础

  • JVM的编译策略

  • GC的三大基础算法

  • GC的三大高级算法

  • GC策略的评价指标

  • JVM信息查看

  • GC通用日志解读

  • jvm的card table数据结构

  • Java类初始化顺序

  • Java对象结构及大小计算

  • Java的类加载机制

  • Java对象分配简要流程

  • 年老代过大有什么影响

  • Survivor空间溢出实例

  • 关于Object=null

  • Java线程与Xss

Xss与线程个数

Xss越大,每个线程的大小就越大,占用的内存越多,能容纳的线程就越少;Xss越小,则递归的深度越小,容易出现栈溢出 java.lang.StackOverflowError。减少局部变量的声明,可以节省栈帧大小,增加调用深度。

/**
 * -Xss128K   deep of calling = 675
 * -Xss256K   deep of calling = 1686
 *
 * Xss越大,每个线程的大小就越大,占用的内存越多,能容纳的线程就越少
 * Xss越小,则递归的深度越小,容易出现栈溢出  java.lang.StackOverflowError
 * 减少局部变量的声明,可以节省栈帧大小,增加调用深度
 */
public class XssDemo {
    private static int count=0;
    public static void recursion(){
        //减少局部变量的声明,可以节省栈帧大小,增加调用深度
        long a=1,b=2,c=3,d=4,e=5,f=6,q=7,x=8,y=9,z=10;
        count++;
        recursion();
    }
    public static void main(String args[]){
        try{
            recursion();
        }catch(Throwable e){
            System.out.println("deep of calling = "+count);
            e.printStackTrace();
        }
    }
}

java线程数决定因素

JVM中可以生成的最大数量由JVM的堆内存大小、Thread的Stack内存大小、系统最大可创建的线程数量(Java线程的实现是基于底层系统的线程机制来实现的,Windows下_beginthreadex,Linux下pthread_create)三个方面影响。

具体数量可以根据Java进程可以访问的最大内存(32位系统上一般2G)、堆内存、Thread的Stack内存来估算。

 (MaxProcessMemory - JVMMemory – ReservedOsMemory) / (ThreadStackSize) = Number of threads
  • MaxProcessMemory : 进程的最大寻址空间

  • JVMMemory : JVM内存

  • ReservedOsMemory : 保留的操作系统内存,如Native heap,JNI之类,一般100多M

  • ThreadStackSize : 线程栈的大小,jvm启动时由Xss指定

/**
 * -XX:+PrintFlagsFinal
 * maxHeapSize 289406976 byte
 * maxPermSize 85983232 byte
 * threadStackSize 1024 byte
 *
 * JVM中可以生成的最大数量由JVM的堆内存大小、Thread的Stack内存大小、系统最大可创建的线程数量
 * (Java线程的实现是基于底层系统的线程机制来实现的,Windows下_beginthreadex,Linux下pthread_create)三个方面影响。
 * 具体数量可以根据Java进程可以访问的最大内存(32位系统上一般2G)、堆内存、Thread的Stack内存来估算。
 *
 * (MaxProcessMemory - JVMMemory – ReservedOsMemory) / (ThreadStackSize) = Number of threads
 * MaxProcessMemory : 进程的最大寻址空间
 * JVMMemory : JVM内存
 * ReservedOsMemory : 保留的操作系统内存,如Native heap,JNI之类,一般100多M
 * ThreadStackSize : 线程栈的大小,jvm启动时由Xss指定
 *
 * http://www.rigongyizu.com/jvm-max-threads/
 */
public class TestMaxThread {
    public static final int BATCH_SIZE = 2000;
    public static void main(String[] args){
        List threads = new ArrayList();
        try{
            for(int i=0;i<=100*1000;i+= BATCH_SIZE){
                long start = System.currentTimeMillis();
                createThread(threads,BATCH_SIZE);
                long end = System.currentTimeMillis();
                Thread.sleep(1000);
                long delay = end - start;
                System.out.printf("%,d threads: Time to create %,d threads was %.3f seconds %n", threads.size(), BATCH_SIZE, delay / 1e3);
            }
        }catch(Throwable e){
            System.out.println("After creating "+ threads.size()+" threads");
            e.printStackTrace();
        }
    }
    private static void createThread(List threads,int num){
        for(int i=0;i

你可能感兴趣的:(jvm)