摘要: 创建线程有四种方式: (1)继承Thread类重写run()方法,调用start()方法启动线程。 (2)实现Runable接口,实现run()方法。 (3)实现Callable接口,实现call()方法。 (4)线程池创建线程。 为什么要使用线程池:减少线程的上下文切换带来的损耗、减少创建线程和销 阅读全文
posted @ 2023-05-28 16:10 程序员_YHB 阅读(73) 评论(0) 推荐(0)
摘要: 并发:两个或多个线程轮流使用CPU资源。 并行:多个核同时调度线程执行任务,这个时候就是并行。 阅读全文
posted @ 2023-05-28 15:50 程序员_YHB 阅读(21) 评论(0) 推荐(0)
摘要: (1)进程是操作系统分配资源的基本单位。线程是CPU任务调度的基本单位。 (2)一个进程可以包含多个线程,进程内的线程共享进程内的资源。 (3)进程和进程之间的内存和资源相互隔离。 阅读全文
posted @ 2023-05-28 15:45 程序员_YHB 阅读(33) 评论(0) 推荐(0)
摘要: 强引用:普通对象的强引用关系。如:直接的赋值语句:String str=new String(“string”);强引用不会被垃圾回收。 软应用:当内存不足时,具有软引用关系的对象会被垃圾回收。 弱引用:不管内存足不足,都会被垃圾回收。 虚引用:虚引用通常配合引用队列来使用,用于跟踪对象被垃圾回收的 阅读全文
posted @ 2023-05-27 15:14 程序员_YHB 阅读(167) 评论(0) 推荐(0)
摘要: JVM有四种垃圾回收器: (1)串行垃圾回收器:采用单线程进行垃圾回收,占用内存比较小,适合个人电脑使用。 serial垃圾回收器:用于新生代垃圾回收,采用标记复制算法。 serial Old垃圾回收器:用于老年代垃圾回收,采用标记整理算法。 缺点:垃圾回收时只有一个线程在工作,其它java应用的线 阅读全文
posted @ 2023-05-27 14:51 程序员_YHB 阅读(133) 评论(0) 推荐(0)
摘要: 判断一个对象是否存活的方法: (1)引用计数法:给每个对象设置一个引用计数器,对象被引用时就+1,引用失效时就-1,当对象的引用为0时,该对象就被视为垃圾对象,等待垃圾回收。但是该方法不能解决循环引用问题。例如:A引用B,B应用A。现在的虚拟机一般不用这种方法。 (2)可达性分析法:沿着GC Roo 阅读全文
posted @ 2023-05-27 13:54 程序员_YHB 阅读(23) 评论(0) 推荐(0)
摘要: 类加载:把类的数据加载到内存,并对数据进行校验、解析、初始化,最终形成可以被虚拟机直接使用的class对象。 类加载机制:类加载采用双亲委派机制。 双亲委派机制:当类加载器收到类加载请求时,它不会第一时间去加载这个类,而是由父类加载器去加载,如果父类加载器加载不到这个类,才由子类加载器加载。 双亲委 阅读全文
posted @ 2023-05-26 14:00 程序员_YHB 阅读(71) 评论(0) 推荐(0)
摘要: 常量池:可以看作是一张表,虚拟机指令根据常量表找到要执行的类名、方法名、参数类型、字面量等信息。 查看字节码结构的指令:javap -v xxx.class。 运行时常量池:当类被加载,会把该类的常量池信息放入运行时常量池中,并把里面的符号地址变为真实地址。 阅读全文
posted @ 2023-05-26 13:37 程序员_YHB 阅读(25) 评论(0) 推荐(0)
摘要: 除了程序计数器其它都会发生内存溢出: 堆:堆内存耗尽,对象越来越多,又一直在使用,不能被垃圾回收。 方法区:方法区内存耗尽,加载的类越来越多,在运行期间动态产生大量的类。 栈:方法调用次数过多,无限创建大量的线程。 阅读全文
posted @ 2023-05-25 15:03 程序员_YHB 阅读(12) 评论(0) 推荐(0)
摘要: JVM内存结构由五部分组成: 堆:java堆是所有线程共享的一块内存,几乎所有的对象实例和数组都要在堆中分配内存,因此该区域也经常发生垃圾回收操作。 方法区:线程共享的。存放已被加载的类信息、常量、静态变量。 虚拟机栈:线程私有的,每个方法执行时都会创建一个栈帧,用来存储局部变量表、操作数、动态链接 阅读全文
posted @ 2023-05-25 14:37 程序员_YHB 阅读(35) 评论(0) 推荐(0)