
获得徽章 6
- 1、在《Java Concurrency in Practice》一书中,给出了估算线程池大小的公式:
Nthreads=NcpuUcpu(1+w/c),其中
Ncpu=CPU核心数
Ucpu=cpu使用率,0~1
W/C=等待时间与计算时间的比率
2、《Programming Concurrency on the JVM Mastering》即《Java 虚拟机并发编程》
线程数=Ncpu/(1-阻塞系数)
计算密集型:假设没有等待w=0,则W/C=0. Nthreads=Ncpu
IO密集型=2Ncpu(可以测试后自己控制大小,2Ncpu一般没问题)(常出现于线程中:数据库数据交互、文件上传下载、网络数据传输等等)
选择线程池并发线程数的因素很多:任务类型、内存等线程中使用到所有资源都需要考虑。展开评论点赞 - 轻量级锁是通过自旋锁进行多次CAS重试
JDK1.6,默认10次的次数
JDK1.6以后,更具上次自旋所使用的时间
synchronized锁膨胀:程序中计算一次hashCode,就无法使用偏向锁,即使使用了,也由偏向锁变成重量级锁展开评论点赞 - 在堆内存里,根触及不到的地方,就视为垃圾对象,也就是GC需要回收的对象
标记/清除算法
STW
缺点:
1.效率低
2.碎片化
复制算法
1、浪费一块内存
新生代:8(Eden):1(from):1(to)
分代算法
1、为什么要分代?
分治算法
简化了新对象的分配
可以更加有效的清除我们不需要的对象
2、为什么不是一块Survivor空间而是两块?
3、Java垃圾回收会出现不可回收的对象吗?展开评论点赞 - Java内存结构:
自己的数据:方法区
自己的方法:本地方法栈
别人的数据:堆
别人的方法:虚拟机栈
程序计数器
可达性分析算法 根搜索算法(GC Roots)
1.虚拟机栈的栈帧的局部变量表所引用的对象;
2.本地方法栈的JNI所引用的对象;
3.方法区的静态变量和常量所引用的对象。
在堆内存里,根触及不到的地方,就视为垃圾对象,也就是GC需要回收的对象展开评论点赞