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) 收藏 举报
浙公网安备 33010602011771号