进程、线程、协程的区别和通信方式
进程
进程,是操作系统资源分配(CPU时间片、内存空间)的最小单位。
进程通信:
每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核
,在内核中开辟一块缓冲区,进程A把数据从用户空间拷到内核缓冲区,进程B再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信。
《深入理解Java虚拟机》之虚拟机类加载机制
类加载过程
当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、连接、初始化3个步骤来对该类进行初始化。如果没有意外,JVM将会连续完成3个步骤,所以有时也把这个3个步骤统称为类加载或类初始化。
JVM虚拟机执行class字节码的过程可以分为7个阶段:加载、验证、准备、解析、初始化、使用、卸载
(没事多看书,多总结,多动手。)
String类相关知识点
Java语言中String类是否可以被继承?
在Java中String类的定义是
1 | public final class String implements java.io.Serializable, Comparable<String>, CharSequence {...} |
由此,可知String类是不可以被继承的,因为被final修饰的类是不可以被继承的
《深入理解Java虚拟机》之内存划分与溢出异常
虚拟机内存管理
JVM所管理的内存包括以下几个运行时数据区域:
不同虚拟机实现可能略微有所不同,但都会遵从 Java 虚拟机规范,Java 8 虚拟机规范规定,Java 虚拟机所管理的内存将会包括以下几个区域:
- 程序计数器(Program Counter Register)
- Java 虚拟机栈(Java Virtual Machine Stacks)
- 本地方法栈(Native Method Stack)
- Java 堆(Java Heap)
- 方法区(Methed Area)
《深入理解Java虚拟机》之GC
内存动态分配和垃圾收集技术
GC:哪些内存需要回收?什么时候回收?如何回收?
当需要排查各种内存溢出、内存泄露问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,就需要对内存动态分配和垃圾收集技术实施必要的监控和调节。
垃圾收集器关注的是Java堆和方法区中的动态分配和回收的内存。
判断对象存活与否?
1、引用计数算法:主流的Java虚拟机未采用,很难解决对象之间相互循环引用的问题
2、可达性分析算法:判定对象是否可回收
对象真正死亡:至少经历两次标记过程:finalize()最多执行一次
一、垃圾收集算法:
1.标记-清除算法 Mark and Sweep
分为标记和清除两个阶段,是最基础的收集算法,主要不足:1、效率问题;2、空间问题:标记清除之后会产生大量不连续的内存碎片,导致之后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次GC。
《深入理解Java虚拟机》之Java内存模型
一、内存模型
1.分为主内存和工作内存,分别对应虚拟机内存的堆内存、栈内存、方法区
2.8大基本操作:lock->unlock, read->load->use->assign->store->write
3.原子性、可见性、有序性
二、线程安全与高效并发:
线程调度:
1.内核线程(KLT)
2.用户线程(UT)
3.用户线程(UT)与轻量级进程(LWP)的混合模式
高效并发:
多线程环境下,线程资源的安全调用:
先行发生原则:happens before原则: