JVM
比天空更远
whyJava!我爱Java!
展开
-
Java 中的强引用、软引用、弱引用、虚引用
强引用:最普遍的引用:Object obj = new Object() 抛出OutOfMemoryError终止程序也不会回收具有强引用的对象 通过将对象设置为null来弱化引用,使其被回收软引用:对象处在有用但非必须的状态 只有当内存空间不足时,GC 会回收该引用的对象的内存 可以用来实现高速缓存 String str = new String("abc"); ...原创 2019-08-08 15:53:09 · 132 阅读 · 0 评论 -
线程相关
创建线程方式:继承Thread类 实现Runnable接口 通过Callable接口的call方法 通过创建线程池来创建线程,使用 ExecutorService 的 execute 方法:继承Thread类,然后调用start方法:class SampleThread extends Thread { //重写run方法,线程运行后,跑的就是run方法 ...原创 2019-08-20 13:43:15 · 238 阅读 · 0 评论 -
Java 锁机制
一、按照锁性质分类公平锁 / 非公平锁: 公平锁是指多个线程按照申请锁的顺序来获取锁。非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。对于ReentrantLock而言,通过构造函数指定该锁是否为公平锁,默认是非公平锁。非公平锁的优点在于吞吐量比公平锁大。对于Synchronized而言,只能是一种非公平锁。乐观锁 / 悲...原创 2019-08-11 11:53:37 · 267 阅读 · 0 评论 -
volatile 关键字
Java语言提供了一种稍弱的同步机制,即volatile变量,用来确保将变量的更新操作通知到其他线程。当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序。volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取volatile类型的变量时总会返回最新写入的值。 在访问volati...原创 2019-08-20 10:56:09 · 183 阅读 · 0 评论 -
JVM 类加载机制
JVM 类加载机制分为五个部分:加载,验证,准备,解析,初始化加载 加载是类加载过程中的一个阶段,这个阶段会在内存中生成一个代表这个类的 java.lang.Class 对象,作为方法区这个类的各种数据的入口。注意这里不一定非得要从一个 Class 文件获取,这里既可以从 ZIP 包中读取(比如从 jar 包和 war 包中读取),也可以在运行时计算生成(动态代理),也可以...原创 2019-08-10 18:50:27 · 167 阅读 · 0 评论 -
Synchronized 和 ReentrantLock 的区别
Synchronized 和 ReentrantLock 的区别 一、 两者的共同点: 都是用来协调多线程对共享对象、变量的访问 都是可重入锁,同一线程可以多次获得同一个锁 都保证了可见性和互斥性二、 两者的不同点: ReentrantLock 显示的获得、释放锁,synchronized 隐式获得、释放锁 ReentrantLock 可响应中断、可轮回,synchron...原创 2019-08-10 14:26:41 · 411 阅读 · 0 评论 -
JVM 内存区域
JVM 内存区域主要分为线程私有区域【程序计数器、虚拟机栈、本地方法区】、线程共享区域【JAVA 堆、方法区】、直接内存。1. 程序计数器(线程私有) 程序计数器是一块较小的内存空间,是当前线程所执行的字节码的行号指示器,每条线程都要有一个独立的程序计数器,这类内存也称为“ 线程私有 ”的内存。正在执行 java 方法的话,计数器记录的是虚拟机字节码指令的地址(当前指...原创 2019-08-10 10:56:50 · 222 阅读 · 0 评论 -
JAVA四种线程池
四种线程池Java通过Executors提供四种线程池,分别为:1,newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。2,newFixedThreadPool创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。3,newScheduledThreadPool创建一个定...原创 2019-07-17 15:10:48 · 203 阅读 · 0 评论 -
进程和线程
Java进程与线程的区别 进程之间共享信息可通过TCP/IP协议,线程间共享信息可通过共用内存 进程是资源分配的最小单位,线程是CPU调度的最小单位。错误:线程是系统进行资源分配和调度的一个独立单位 进程是抢占处理机的调度单位;线程属于某个进程,共享其资源 线程是程序的多个顺序的流动态执行 线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个...原创 2019-07-29 13:15:02 · 7418 阅读 · 4 评论 -
死锁相关
什么是死锁 死锁是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。产生死锁的原因a. 竞争资源系统中的资源可以分为两类:可剥夺资源,是指某进程在获得这类资源后,该资源可以再被其他进程或系统剥夺,CPU和主存均属于可剥夺性资源;另一类资源是不可剥夺资源,当系统把这类资源分配给某进程后,再不能强...原创 2019-07-30 16:28:10 · 411 阅读 · 2 评论 -
Java 内存模型中堆与栈的区别
管理方式:栈自动释放,堆需要GC 空间大小:栈比堆小 碎片相关:栈产生的碎片远小于堆 分配方式:栈支持静态和动态分配,而堆只支持动态分配 效率:栈的效率比堆高Class a= new Class();此时a叫实例,而不能说a是对象。实例在栈中,对象在堆中,操作实例实际上是通过实例的指针间接操作对象。多个实例可以指向同一个对象。...原创 2019-08-01 11:45:52 · 488 阅读 · 0 评论 -
JVM 几种常见GC收集器
Stop - the - World:JVM由于要执行GC而停止了应用程序执行 任何一种GC算法中都会发生 多数GC优化通过减少Stop - the - World发生的时间来提高程序性能(高吞吐、低停顿)吞吐量 = 运行用户代码时间 / (运行用户代码时间 + 垃圾收集时间)常见的垃圾收集器新生代垃圾收集器:Serial收集器(复制算法):单线程收集,...原创 2019-08-06 12:01:37 · 2701 阅读 · 0 评论 -
JVM 垃圾回收算法
GC触发时机 由于对象进行了分代处理,因此垃圾回收区域、时间也不一样。GC有两种类型:Scavenge GC和Full GC。Scavenge GC 一般情况下,当新对象生成,并且在Eden申请空间失败时,就会触发Scavenge GC,对Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区。然后整理Survivor的两个区。这种方式的GC是对年轻代的...原创 2019-08-06 12:42:52 · 214 阅读 · 0 评论 -
Java 的异常体系
Error和Exception的区别Error:程序无法处理的系统错误,编译器不做检查 Exception:程序可以处理的异常,捕获后可能恢复常见的Error以及ExceptionRuntimeExceptionNullPointerException - 空指针引用异常 ClassCastException - 类型强制转换异常 IllegalArgument...原创 2019-08-08 17:54:56 · 133 阅读 · 0 评论 -
Java 线程池
为什么要使用线程池降低资源消耗 提高响应速度。 当任务到达时,任务可以不需要的等到线程创建就能立即执行。 提高线程的可管理性(对线程进行统一的分配、调优和监控)利用Executors创建不同的线程池满足不同场景的需求1. newFixedThreadPool(int nThreads) 指定工作线程数量的线程池2. newCachedThreadPool() 处理...原创 2019-08-08 17:36:30 · 149 阅读 · 0 评论 -
进程与线程
Java进程与线程的区别 进程之间共享信息可通过TCP/IP协议,线程间共享信息可通过共用内存 进程是资源分配的最小单位,线程是CPU调度的最小单位。错误:线程是系统进行资源分配和调度的一个独立单位 进程是抢占处理机的调度单位;线程属于某个进程,共享其资源 线程是程序的多个顺序的流动态执行 线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个...原创 2019-08-26 15:36:40 · 332 阅读 · 0 评论