java
文章平均质量分 62
java
「已注销」
这个作者很懒,什么都没留下…
展开
-
Minor GC、Full GC 清晰明了
阅读前提:了解JVM内存模型。Minor GC: 对新生代进行垃圾回收,速度快。Full GC: 又称Major GC,对老年代进行垃圾回收,通常会伴随至少一次的Minor GC,但不是绝对。通常速度要比Minor GC慢10倍。创建大对象,通过参数PretenureSizeThreshold设置大对象标准,大对象直接存入老年代。创建小对象,小对象存储在Eden区。当Eden满时,若老年代无空间担保则进行Full GC。若老年代有空间担保则进行Minor GC,进行Minor GC发现存活的对象太多,原创 2022-01-31 13:07:42 · 707 阅读 · 1 评论 -
synchronized、volatile的区别
synchronized可以作用于变量、实例方法、静态方法,volatile只作用于变量。同一时刻只有一个线程能进入synchronized作用的代码,其他线程会阻塞。volatile不会阻塞。synchronized能保证原子性、可见性、顺序性。volatile能保证可见性、一定程度的顺序性,不能保证原子性。synchronized作用的代码可以被编译器、处理器优化。volatile禁止指令重排序。...原创 2022-01-29 20:34:48 · 326 阅读 · 0 评论 -
线程池原理 详细
为什么要使用线程池?当某个线程类的所需运行时间短且需频繁启动时,应用程序需要频繁的创建线程、销毁线程、线程切换。单个线程的创建、销毁消耗的系统cpu、内存等资源很少,但庞大的数量将耗费很多的资源,且频繁的线程切换也将消耗许多的cpu资源。使用线程池时,某个线程执行完任务后不会被销毁,而是等待执行下一个任务,这样线程得以复用,也就没有频繁创建、销毁线程的消耗。线程池原理关键类ThreadPoolExecutoruml图Executor:接口,只定义了void execute(Runnable c原创 2022-01-27 15:37:46 · 285 阅读 · 0 评论 -
线程生命周期 什么时候会出现僵死进程
线程生命周期wait方法会释放锁,sleep不会释放锁。在线程t中调用t2.join(),线程t进入阻塞状态直到线程t2执行完毕。Thread.yield()线程主动放弃cpu使用权。什么时候会出现僵死进程一个进程创建了子进程,父子进程异步执行。当子进程死亡时,操作系统会释放子进程占用的资源,但仍保留进程号、状态等信息,直到父进程调用wait或waitpid方法,这些信息才会被清除。若子进程先于父进程死亡,但父进程不调用wait或waitpid,则子进程的信息会一直保留,一直占用着进程号,这就是原创 2022-01-28 14:32:29 · 967 阅读 · 0 评论 -
java内存模型 Java Memory Model (JMM)
共享变量存储在主内存。每个线程都有自己的工作内存,线程不能访问其他线程的工作内存。线程从主内存读取共享变量,存入自己的工作内存,修改变量的值会更新自己的工作内存,在某个时机再刷新到主内存。...原创 2022-01-29 21:22:55 · 619 阅读 · 1 评论 -
线程安全 如何实现线程安全 volatile ThreadLocal
什么是线程安全多线程执行某段代码,不对这段代码进行同步处理、线程间的协调,程序运行的结果仍与预期一致,这就是线程安全。多线程编程的三个核心概念原子性: 同数据库事务的原子性,一些操作要么全部成功,要么全部失败,经典的例子就是银行转账。可见性:多线程并发访问共享变量时,某个线程对共享变量的更新,其他线程能立即看到这个更新。现代的计算机都有几层缓存,一个变量在多个线程中共享,每个线程都会对这个变量进行缓存,某个线程内部更新该变量会立即更新缓存,但不会立即更新主内存,这使得其他线程无法立即观察到这原创 2022-01-28 22:59:08 · 2323 阅读 · 1 评论 -
如何合理配置线程池大小
根据任务的类型合理选择线程池大小。任务类型有CPU密集型、IO密集型、混合型。CPU密集型:任务会消耗大量的CPU资源,推荐线程池大小为CPU核数+1。因为线程过多时线程切换会带来额外开销。IO密集型:线程数需较大,以便线程等待IO返回时,CPU能执行其他线程的任务。最佳线程数目= (线程等待时间与线程CPU时间之比 + 1) * CPU核数混合型:考虑拆分成CPU密集型和IO密集型。若CPU密集型和IO密集型的处理时间差不多,可以拆分,会比串行效率高。若CPU密集型和IO密集型的处理时间差很多,处原创 2022-01-29 11:39:29 · 1057 阅读 · 1 评论 -
volatile 和 Threadlocal 的原理和适用场景
volatile原理volatile能保证可见性和一定程度的顺序性。变量被volatile修饰时,线程对变量进行写操作时jvm会向处理器发送lock前缀指令,lock前缀指令相当于内存屏障。内存屏障的功能写操作修改的值会立即刷新到主内存,并设置其他线程的缓存无效,线程读取变量必需从主内存读取新值,保证了可见性。禁止指令重排序,后面的指令不能再内存屏障之前,前面的指令不能再内存屏障之后,保证一定程度的顺序性。使用场景单例模式双重检查,由于编译器、处理器会进行指令重排序,在多线程下,线程有原创 2022-01-29 17:44:51 · 934 阅读 · 0 评论 -
jvm垃圾收集器
serial收集器,串行运作,作用于新生代,使用复制算法,会stop the world,有较长的停顿时间。适用于单cpu且对停顿时间无要求的场景。serial old收集器,serial收集器的年老代版本。ParNew收集器,并行运作,作用于新生代,使用复制算法,会stop the world。适用于多cpu的场景。Parallel scavenge收集器,并行运作,作用于新生代,使用复制算法,会stop the world,能够通过参数开启自适应调整策略,结合虚拟机的当前运行情况调整参数以获取最大原创 2022-01-24 10:46:13 · 211 阅读 · 0 评论 -
GC finalize方法
finalize方法Object类中定义的protected方法用户可以调用对象的finalize,但不影响jvm对finalize的处理jvm最多可以执行一次对象的finalize方法与finalize相关的回收过程当对象被判定为与GC Roots无引用链相连,即不可达时,若对象未覆盖finalize方法,将直接被jvm回收。若对象覆盖了finalize方法,则判断是否已经执行过finalize方法。若已执行过,对象将被回收,否则,将对象放入F-Queue,由低优先级的线程执行finaliz原创 2022-02-01 15:43:52 · 2667 阅读 · 1 评论 -
class文件结构
大致结构ClassFile { magic minor_version major_version constant_pool_count cp_info constant_pool[constant_pool_count-1] access_flags this_class_index super_class_index interfaces_count interfaces[interfaces_count] fields_count field_info fields[fie原创 2022-02-22 15:58:59 · 542 阅读 · 0 评论 -
jvm调优 详细 多个案例分析
什么时候需要调优原创 2022-02-19 17:14:41 · 3359 阅读 · 1 评论 -
jvm内存结构简单
jvm运行时结构包含堆、元空间、虚拟机栈、本地方法栈、程序计数器。堆和元空间是线程共享的。虚拟机栈、本地方法栈、程序计数器是线程私有的,每个线程都有独立的一份。堆线程公有。所有new出来的、反射构造的对象都存放在堆中。堆分为年轻代和老年代。gc时年轻代的对象符合某个条件就会晋升到老年代。年轻代分为Eden区、Survivor 1区、Survivor 2 区。年轻代一般使用复制算法。老年代一般使用标记-压缩算法。元空间线程公有。jdk8及以后才有元空间,之前是方法区。元空间使用本地内存,不属于虚拟机的原创 2022-02-20 12:54:29 · 503 阅读 · 1 评论 -
java面试题
基本概念与常识java语言的特点简单容易面向对象(封装、继承、多态)平台无关性(通过不同平台的jvm实现)支持多线程(c++无多线程机制,需要依赖操作系统的多线程机制)适合网络编程可靠、安全编译与解释并存(java源码先经编译器编译为字节码,再由解释器解释执行)JVM vs JDK vs JREjava语言的“一次编译,到处运行”是通过不同平台的jvm来实现的。JVM有很多种,例如Hotspot VM、J9 VM、JRocket等,只要满足jvm规范即可,每个人都可以实现自己的jv原创 2022-02-23 21:15:09 · 535 阅读 · 1 评论 -
设计模式 精讲 在JDK、Spirng中的应用
设计模式原则描述开闭原则对扩展开放,对修改关闭。提高可维护性里式替换原则子类尽量不要对父类的非抽象方法进行重写依赖倒置原则高层不应该依赖低层,面向接口编程单一职责类的职责尽量单一,高内聚接口隔离接口的职责进行精简,高内聚迪米特法则不要对陌生人说话,陌生指当前对象对另一个对象的交互不直接,要合作完成功能需要额外转换工作合成复用原则尽量少用继承,多用聚合,降低耦合单例模式全局只需要一个实例。有多种实现,推荐双重检查、静态内部类、枚原创 2022-03-19 23:07:15 · 200 阅读 · 1 评论 -
垃圾收集算法
可达性分析从GC Roots开始搜索对象引用,搜索的路径成为引用链。若一个对象无引用链与GC Roots相连为不可达,否则可达。垃圾收集算法标记-清除(Mark Sweep)算法每个对象对应一个标记位,记录是否可达。标记。对空间中对象进行可达性分析,标记可达对象。清除不可达对象。优点:只需找到对象被一个GC Roots可达的对象引用即可判断可达。不移动对象缺点:内存碎片问题。当执行多次标记清除算法后,会产生大量小的内存碎片。当要创建大对象,会遇到无足够连续空间分配。标记和清除两原创 2022-02-01 23:25:07 · 337 阅读 · 1 评论 -
为什么jvm需要多种类加载器 详细
为什么jvm需要多种类加载器需要从多种来源读取类字节流,例如网络、数据库、文件系统等。相同包路径下的两个类A、B,只有都由同一个类加载器加载时类B才有对类A的package访问权限。启动类加载器加载的java.lang.Integer,由其他类加载器加载器的用户创建的java.lang.MyClass就无package权限访问java.lang.Integer。多种类加载器防止了对基础类的包访问侵入。包访问权限:相同包路径下的两个类A、B,类B具有访问类A的public、no modifier、pro原创 2022-02-05 14:53:16 · 1051 阅读 · 1 评论 -
类加载 类加载器 详细
类加载过程读取.class文件,加载字节码。加载。包含验证、解析、初始化。原创 2022-02-03 22:55:57 · 322 阅读 · 2 评论