JUC2019-2

 

volatile:
1.1保证可见性
1.2不保证原子性
1.3禁止指令重排

java.util.ConcurrentModificationException
java.lang.IllegalMonitorStateException


ArrayBlockingQueue:由数组结构组成的有界阻塞
LinkBlockingQueue:由链表结构组成的有界(但大小默认值为Integer.MAX_VALUE)阻塞队列
PriorityBlockingQueue:支持优先级排序的无界阻塞队列
DelayQueue:使用优先级队列实现的延迟无界阻塞队列
SynchronousQueue:不存储元素的阻塞队列,也即单个元素队列
LinkedTransferQueue:由链表结构组成的无界阻塞队列
LinkedBlockingDeque:由链表结构组成的双向阻塞队列。


synchronized与lock
1:synchronized是关键字属于JVM层,底层是monitor对象来完成
   Lock是具体类java.util.concurrent.lock.Lock的api
2synchronized不需要手动释放
 ReentrantLock需要手动释放try/finally

3:synchronized不可中断
ReentrantLock可中断,设置超时trylock,lockInterruptibly

4:synchronized非公平锁
  ReentrantLock两都可以

5锁绑定多个条件condition
  synchronized没有
  ReentrantLock用来实现分组唤醒需要唤醒的线程们


线程池
线程复用,控制最大并发数,管理线程

ThreadPoolExecutor
threadpoolexecutor
        Executors.newFixedThreadPool(5);
        Executors.newSingleThreadExecutor();
        Executors.newCachedThreadPool();
Executors.newScheduledThreadPool(5);
Executors.newWorkStealingPool(5);


public ThreadPoolExecutor(int corePoolSize,//核心线程数
                              int maximumPoolSize,//最大线程数
                              long keepAliveTime,//存活时间
                              TimeUnit unit,//时间单位
                              BlockingQueue<Runnable> workQueue,//任务队列
                              ThreadFactory threadFactory,//线程工厂,使用默认
                              RejectedExecutionHandler handler) {//拒绝策略
        ExecutorService threadPool = new ThreadPoolExecutor(
                2,//核心线程数
                5,//最大线程数
                100L,//存活时间
                TimeUnit.SECONDS,//时间单位
                new LinkedBlockingQueue<>(3),//任务队列
                Executors.defaultThreadFactory(),//线程工厂
                new ThreadPoolExecutor.DiscardPolicy()//.DiscardOldestPolicy()//.CallerRunsPolicy()//.AbortPolicy()//拒绝策略
        );
四种拒绝策略
new ThreadPoolExecutor.AbortPolicy()//直接抛出RejectedExecutionException异常阻止系统正常运行
new ThreadPoolExecutor.CallerRunsPolicy()//调用者运行,调节机制,该策略既不会抛弃任务,也不会抛异常,而是将某些任务回退到调用者
new ThreadPoolExecutor.DiscardOldestPolicy()//抛弃队列中等待最久的任务,然后把当前的任务加入队列中尝试再次提交当前任务
new ThreadPoolExecutor.DiscardPolicy()//直接丢弃任务,不予任何处理也不抛异常。

corePoolSize//核心线程数,CPU密集型,CPU线程数+1
corePoolSize//核心线程数,IO密集型,CPU线程数/(1-0.8,0.9)


linux ps -ef |grep xxx
windows对应指令 jps -l
jstack 2532


引用计数
复制
标记清除
标记整理

GC Roots
枚举根节点做可达性分析(根搜索路径)

哪些可以作为JAVA GC Roots对象
1:虚拟机栈
2:方法区中的类静态属性引用的对象
3:方法区中常量引用的对象
4:本地方法栈中JNI(native方法)引用的对象


jvm参数类型:
1,标配参数,java -version
2,X参数,java -Xint -version,java -Xcommp -version
3,XX参数: -XX:+或者-某个属性值,+表示开启,-表示关闭。

如何查看一个正在运行中的java程序,它的某个jvm参数是否开启?具体值是多少?
jps 
jinfo

-XX:+PrintGCDetails 
-XX:+UseSerialGC 

jinfo -flag PrintGCDetails xxx
jinfo -flag UseSerialGC    xxx
jinof -flag InitialHeapSize xxx

-XX:MetaspaceSize=128m
-XX:MaxTenuringThreshold=15


jinfo -flags  xxx 

-Xms1024m -Xmx1024m

-Xms 等于 -XX:InitialHeapSize
-Xmx 等于 -XX:MaxHeapSize

盘点家底查看JVM默认值
1:-XX:+PrintFlagsInitial  java -XX:+PrintFlagsInitial -version
2:-XX:+PrintFlagsFinal java -XX:+PrintFlagsFinal -version
3:PrintFlagsFinal
4:+PrintCommandLineFlags  java -XX:+PrintCommandLineFlags -version  查看gc版本 -XX:+UseG1GC



java -XX:+PrintFlagsFinal -XX:MetaspaceSize=512m T
java -XX:+PrintFlagsFinal -XX:MetaspaceSize=512m HelloGC


        long totalMemory = Runtime.getRuntime().totalMemory();//默认1/64
        long maxMemory = Runtime.getRuntime().maxMemory();//默认1/4
        System.out.println("TOtal_memory(-Xms=)" + totalMemory + "(字节)" + (totalMemory/(double)1024 /1024) + "MB" );
        System.out.println("TOtal_memory(-Xmx=)" + maxMemory + "(字节)" + (maxMemory/(double)1024 /1024) + "MB" );


常用参数:
-Xms 等于 -XX:InitialHeapSize (初始大小内存)默认大小物理内存的1/64
-Xmx 等于 -XX:MaxHeapSize (最大分配内存)默认大小物理内存的1/4
-Xss  设置单个线程栈的大小,一般默认为512K~1024K,等于 -XX:ThreadStackSize ,-Xss128k 
-Xmn  设置年轻代大小
-XX:MetaspaceSize  设置元空间大小,元空间并不在虚拟机中,而是使用本地内存,因此,默认情况下,元空间的大小仅受本地内存限制。
                   -Xms1024m -Xmx1024m -XX:MetaspaceSize=1024m -XX:+PrintFlagsFinal
                   -Xms128m -Xmx4096m -Xss1024k -XX:MetaspaceSize=512m -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseSerialGC
-XX:+PrintGCDetails
-XX:SurvivorRatio   设置新生代中eden和S0/S1空间的比例默认 -XX:SurvivorRatio=8, Eden:S0:S1=8:1:1
                     -XX:SurvivorRatio=4, Eden:S0:S1=4:1:1
                    -XX:+PrintGCDetails -XX:+UseSerialGC -Xms10m -Xmx10m -XX:SurvivorRatio=8
-XX:NewRatio        配置年轻代与老年代在堆结构的占比,默认 -XX:NewRatio=2,新生代占1,老年代2,年轻代占整个堆的1/3
                    假如-XX:NewRatio=4新生代点1,老年代4,年轻代占整个堆的1/5,NewRatio值就是设置老年代的占比。
                    -XX:+PrintGCDetails -XX:+UseSerialGC -Xms10m -Xmx10m -XX:NewRatio=4
-XX:MaxTenuringThreshold  设置垃圾最大年龄:默认15,-XX:MaxTenuringThreshold=16



强引用,正常引用,内存不足也不会被回收,会报OOM。
软引用,内存充足时不会被回收,内存不足时会被回收。
       Map<String,SoftReference<Bitmap>> imageCache = new HashMap<String,SoftReference<Bitmap>>();
弱引用  不管内存够不够,只要发生GC都会被回收。
虚引用  创建虚引用指定关联队列,当GC时会将虚引用加入引用队列。虚引用调用总是返回空。



java.lang.StackOverflowError
java.lang.OutOfMemoryError:java heap space
java.lang.OutOfMemoryError:GC overhead limit exceeded
java.lang.OutOfMemoryError:Direct buffer memory
java.lang.OutOfMemoryError:unable to create new native thread
java.lang.OutOfMemoryError:Metaspace java -XX:+PrintFlagsInitial 查看
                                      size_t MetaspaceSize = 22020096 
                                    -XX:MetaspaceSize=8m -XX:MaxMetaspaceSize=8m
                                    元空间存放以下内容:
                                                        虚拟机加载的类信息
                                                        常量池
                                                        静态变量
                                                        即时编译后的代码。

-Xms10m -Xmx10m -XX:+PrintGCDetails -XX:MaxDirectMemorySize=5m

ByteBuffer.allocate(capability):分配JVM堆内存,属于GC管辖范围,由于需要拷贝所以速度相对较慢
ByteBuffer.allocateDirect(capability):分配OS本地内存,不属于GC管辖范围,由于不需要内存拷贝所以速度相对较快。


linux系统 java -d . UnableCreateNewThreadDemo.java
          java com.example.juc2019_2.UnableCreateNewThreadDemo


ulimit -u  当前用户创建线程最大线程数

vim /etc/security/limits.d/90-nproc.conf

z3  soft   nproc  20000


Serial 串行回收,Parallel 并行回收,CMS 并发标记清除,G1 ,ZGC

java -XX:+PrintCommandLineFlags -version  查看gc版本

java的gc回收的类型主要有以下几种:
UseSerialGC , UseParallelGC , UseConcMarkSweepGC ,  UseParNewGC , UseParallelOldGC , UseG1GC

新生代Young Gen:Serial Coping,Parallel Scavenge, ParNew
Old Gen:  Serial MSC(Serial Old), Parallel Compacting(Parallel Old) CMS
G1


DefNew:Default New Generation
Tenured: Old
ParNew: Parallel New Generation
PSYoungGen: Parallel Scavenge
ParOldGen: Parallel Old Generation



新生代:
       串行GC (Serial)/(Serial Copying)   开启命令  -XX:+UseSerialGC
        并行GC(ParNew)
        并行回收GC(Parallel)/(Parallel Scavenge)

-Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+PrintCommandLineFlags -XX:+UseSerialGC  ()
-Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+PrintCommandLineFlags -XX:+UseParNewGC  (ParNew+Tenured)
-Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+PrintCommandLineFlags -XX:+UseParallelGC (PSYoungGen+ParOldGen)
-Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+PrintCommandLineFlags -XX:+UseParallelOldGC (PSYoungGen+ParOldGen)
-Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+PrintCommandLineFlags -XX:+UseConcMarkSweepGC ()
-Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+PrintCommandLineFlags -XX:+UseG1GC            ()

-XX:ParallelGCThreads

-Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+PrintCommandLineFlags -XX:+UseParallelGC -XX:+UseParallelOldGC
-Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+PrintCommandLineFlags -XX:+UseParNewGC -XX:+UseConcMarkSweepGC

G1:区域化内存划分Regin,整体编为一些不连续的内存区域,避免了全内存区的GC操作,G1并不要求对象的存储一定是物理上连续的,只要逻辑上连续即可。启动时可以通过参数-XX:G1HeapRegionSize=n可指定分区大小(1MB~32MB,且必须是2的次幂),默认将整个堆划分为2048个分区,最大内存为32MB * 2048 = 65536MB=64G内存。
-XX:+UseG1GC
-XX:G1HeapRegionSize=n  设置G1区域大小
-XX:MaxGCPauseMillis=n   最大GC停顿时间
-XX:InitialHeapOccupancyPercent=n 堆占用了多少就触发GC,默认45
-XX:ConcGCThreads=n               并发GC使用的线程数
-XX:G1ReservePercent=n       设置作为空闲空间的预留内存百分比,默认10%

-XX:UseG1GC -Xmx32g -XX:MaxGCPauseMillis=100
Undertow
java -server jvm的各种参数  -jar xxx.jar/xxx.war

整机:top ,load average:1分钟,5分钟,15分钟,uptime是精简版的top。
CPU:  vmstat:vmstat -n 2 3:每2秒采样一样,总采样3次。r:runtime,原则上1核的CPU的运行队列不超过2,整个系统的运行队列不能超过总核楼的2倍,
                b:block等待资源的进程数,
                us:用户进程消耗CPU时间百分比,如果长期大于50%优化程序
                sy:内核进程消耗的CPU时间百分比
                us + sy 参数参考值为80%。
                id:处于空闲的CPU百分比
                wa:系统等待IO的CPU时间百分比
                st:来自于一个虚拟机偷取的CPU时间的百分比。
      查看所有cpu核信息:mpstat -P ALL 2
      每个进程使用cpu的用量分解信息 pidstat -u 1 -p 进程编号
内存: free: free ,free -g,free -m,pidstat -p xxx -r 采样间隔秒数
硬盘: df: df -h
磁盘IO:iostat: iostat -xdk 2 3,pidstat -p xxx -d 采样间隔秒数
网络IO: ifstat: ifstat 1
        下载 wget http://gael.roualland.free.fr/ifstat/ifstat-1.1.tar.gz
         tar xzvf ifstat-1.1.tar.gz
         cd ifstat-1.1
          ./configure
          make
          make install

CPU占用过高
ps -ef |grep java|grep -v grep
ps -mp 进程 -o THREAD,tid,time
将需要的线程ID转换成16进制的格式(英文小写格式)printf"%x\n"有问题的线程ID。
jstack 进程ID |grep tid(16进制线程ID小写英文)-A60
root     42.5  19    - -         -      - 1189932 01:26:21

12282c
jstack 1189931 |grep 12282c -A60


github.com:watch,会持续收到该项目的动态
           fork,复制某个项目到自己的github仓库中
           star:可以理解为点赞
            clone:将项目下载到本地
            follow:关注你感兴趣的作者。

github.com:in关键词限制搜索范围,xxx关键词in:name或description或readme(seckill in:name,readme )(psycopg2 in:name,readme,description)
            stars或fork数量关键词去查找(springboot stars:>=5000 forks:>500)(springcloud forks:>500 stars:>=5000)。
            awesome加强搜索(awesome redis)
            高亮显示某一行代码(https://github.com/wuyouzhuguli/SpringAll/blob/master/10.Spring-Boot-Ehcache-Cache/src/main/java/com/springboot/service/impl/StudentServiceImpl.java#L18)(https://github.com/wuyouzhuguli/SpringAll/blob/master/10.Spring-Boot-Ehcache-Cache/src/main/java/com/springboot/service/impl/StudentServiceImpl.java#L18-L28)
            项目内搜索(t)
            搜索某个地区内的大佬:location:地区 ,language:语言(location:xiamen language:java)

 

 

 

 

posted on 2026-01-18 09:05  yebinghuai-qq-com  阅读(3)  评论(0)    收藏  举报

导航