Hero Image

Java 虚拟机 虚拟机调优 Java 虚拟机调优参数 -Xms 起始内存 JVM堆内存 -Xmx 最大内存 JVM堆内存 -Xmn 新生代内存 -Xss 栈大小。 就是创建线程后,分配给每一个线程的大小 -XX:NewRatio 设置年轻代和老年代的比值。默认为2:1。如果为3,表示年轻代与老年代的比值为1:3,年轻代占整个年轻代和老年代的1/4。 -XX:SurvivorRatio年轻代中Eden区和两个Survivor区的比值。如果为3,表示Eden:Survivor = 3:2, 因为有两个Survivor区域,所以一个Survivor区占整个年轻代的1/5. -XX:MaxPermSize设置持久代的大小。 收集器的设置 -XX:+UseSerialGC设置串行收集器 -XX:+UseParallelGC设置并行收集器 -XX:+UseParallelOld设置并行老年代收集器 -XX:+UseConcMarkSweepGC设置并发收集器 垃圾回收统计信息 -XX:PrintGC -XX:PrintGCDetails -XX:PrintGCTimeStamps -Xloggc:filename 并行收集器设置 -XX:ParallelGCThreads=n设置并行收集器收集时使用的CPU数。并行收集线程数。 -XX:MaxGCPauseMillis=n设置并行收集最大暂停时间 -XX:GCTimeRatio=n设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n) 并发收集器设置 XX:+CMSIncrementalMode设置为增量模式。适用于单CPU情况。 XX:ParallelGCThreads=n设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。 -Xms1G -Xmx2G -Xmn500M -XX:MaxPermSize=64M -XX:+UseConcMarkSweepGC -XX:SurvivorRatio=3 -Xms1G JVM初始内存1G 这一部分是不是应该是堆内存 -Xmx2G JVM最大内存 2G -Xmn500M 新生代内存 500M -XX:MaxPermSize 持久代内存 64M -XX:SurvivorRatio=3 新生代中Eden:Servivor = 3:2 JVM 调优 -Xms2G -Xmx2G 将JVM最大内存与初始内存设置相等,避免JVM垃圾回收后重新分配内存。 -Xmn1G 年轻代内存Sun官方推荐配置为整个堆的3/8,通常设置为1/3或1/4。 -Xss256K减小每条线程栈的大小,能生成更多的线程 -XX:NewRatio=4 调整年轻代与老年代的比例 年轻代:老年代=1:4 -XX:MaxTenuringThreshold=0 设置晋升到老年代的对象的年龄。 如果设置为0,则年轻代对象不经过Survivor区,直接进入老年代。如果设置一个较大的值,则年轻代对象会在Survivor区进行多次复制。 -XX:+UseConcMarkSweepGC JVM在server模式下默认使用PararrelScavenge+SerialOld的收集器组合进行内存回收,不支持与用户线程并发执行。可使用ParNew+CMS+SerialOld的收集器组合进行内存回收(SerialOld收集器做为CMS收集器出现ConcurrentModeFailure失败后的后备收集器使用),减少stop-the-world时间。 -XX:CMSFullGCsBeforeCompaction 使用CMS时,设置CMS收集器在进行若干次垃圾收集后再启动一次内存碎片

Hero Image

多线程 ​ 守护线程 Java的main是普通线程,并不是守护线程, 守护线程会等待所有的线程执行结束后再结束 线程同步 https://www.jianshu.com/p/2394317257ec https://www.jianshu.com/p/988bfceadb62 https://www.jianshu.com/p/6f98f03430eb https://www.cnblogs.com/williamjie/p/9099141.html Java 主线程等待所有子线程执行完毕 Java 主线程等待所有子线程执行完毕再执行。 用sleep() 让主线程睡眠一段时间,但是这个睡眠时间是主观设置的,是有我们自己主观设定的,所以不推荐使用。 1public static void main(String[] args) throws InterrupteException{ 2 for(int i=0; i<5;i++){ 3 new Thread( 4 new Runnable(){ 5 public void run(){ 6 try{ 7 Thread.sleep(1000); 8 }catch(InterruptException e){ 9 e.preintStrackTrace(); 10 } 11 System.out.println("子线程执行!"); 12 } 13 } 14 ).start(); 15 } 16 Thread.sleep(5000); 17 System.out.println("主线程执行!"); 18} 使用Thread的jion()等待所有的子线程执行完毕,主线程再执行,thread.jion()把指定线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在B中调用了线程A的jion()方法,直到线程A执行完毕后,才会继续执行线程B。 1public static void main(String[] args) throws InterrupteException{ 2 Vector<Thread> threadVector = new Vector<>(); 3 for(int i=0; i<5;i++){ 4 Thread childThread = new Thread( 5 new Runnable(){ 6 public void run(){ 7 try{ 8 Thread.