![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
fu-jw
这个作者很懒,什么都没留下…
展开
-
【JVM】--常见的垃圾收集器
在【JVM】–对象是如何被定义为垃圾及回收算法一文中介绍了四种垃圾回收算法,分别为:引用计数法标记-清除法标记-复制法标记-整理法垃圾收集器就是上面算法理论的具体实现。目前为止还没有出现完美的收集器,更没有万能的收集器,只是针对具体应用最合适的收集器,进行分代收集。垃圾收集器JVM是一个进程,垃圾收集器就是一个线程,垃圾收集线程是一个守护线程,优先级低,其在当前系统空闲或堆中老年代占用率较大时触发。JDK7/8后,HotSpot虚拟机所有收集器及组合(连线),如下图:串行、并行 和原创 2020-07-12 00:07:44 · 5838 阅读 · 0 评论 -
【JVM】--几种常见的OOM分析及总结
内存溢出Out Of Memory简称OOM,在异常体系中属于错误。现总结常见的几种错误如下:OOM-Java heap space为了更快达到效果可以配置虚拟机:-Xmx10m -Xms10mpublic class OOM1 { public static void main(String[] args) { String str = "fjw"; while (true){ str += str ; }原创 2020-07-10 18:31:58 · 6212 阅读 · 0 评论 -
【JVM】--常见配置参数
JVM中的参数类型分三种:标配参数所有的JVM实现都必须实现这些参数的功能,而且向后兼容,比如:versionhelpshowversion相当于上面两个的和-verbose:class输出JVM载入类的相关信息,当JVM报告说找不到类或者类冲突时可此进行诊断verbose:gc输出每次GC的相关情况verbose:jni输出native方法调用的相关情况,一般用于诊断jni调用错误信息X参数默认JVM实现这些参数的功能,但是并不保证所有JVM实现都满足,且不保证向后原创 2020-07-10 18:31:10 · 5522 阅读 · 0 评论 -
【JVM】--对象是如何被定义为垃圾及回收算法
GCGarbage垃圾,即内存中已经不再被使用的空间就是垃圾Garbage Collector垃圾收集器要进行垃圾收集,如何判断一个对象是否可以被回收?引用计数法Java中引用和对象是有关联的,如果要操作对象则必须用引用进行。显然一个简单的办法就是通过引用计数来判断一个对象是否可以回收。简单来说就是给对象添加一个引用计数器,每当有一个地方引用它,计数器值加一;每当有一个引用失效时,计数器值减一。任何时刻计数器值为零的对象就是不能被使用的,则这个对象就是可回收对象。publi原创 2020-07-09 22:29:48 · 5677 阅读 · 0 评论 -
【Java】--死锁问题定位与分析
死锁概念死锁:是指多个进程在运行过程中因争夺资源而造成的一种互相等待的现象,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。死锁产生的4个必要条件产生死锁的必要条件:互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放。不剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。环路等待条件:在发生死锁时,必然存在一个进程–资源的环形链。举个例子,如果有一原创 2020-07-07 19:37:26 · 5576 阅读 · 0 评论 -
【Java】--线程池原理
简介从【Java】基础10一文中我们知道:线程池: 其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源。线程池的工作就是控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等其他线程执行完毕,再从队列中取出任务来执行。特点线程复用;控制最大并发数;管理线程降低资源消耗。通过重复利用已创建的线程,降低线程创建和销毁造成的消耗提高响应速度。当任务到达时,任原创 2020-07-06 21:23:40 · 5496 阅读 · 0 评论 -
【Java】--创建线程方法之Callable
在Java基础部分我们知道,创建线程的两种方式:继承Thread类实现Runable接口简单对比:与Runable相比继承Thread使用简单;但由于Java是单继承,不能再继承其他类,扩展性较差从JDK1.5开始java.util.concurrent包下,新增了Callable接口,可以通过实现Callable接口创建线程。与Runable接口对比实现Runable接口需重写run方法,而实现Callable是重写Call方法run方法无返回值、不能抛异常call方法有返回值原创 2020-07-06 21:22:44 · 5469 阅读 · 0 评论 -
【Java】--阻塞队列
阻塞队列简介在多线程领域:所谓阻塞,在某些情况下会挂起线程(即阻塞),一旦条件满足,被挂起的线程又会被自动唤醒。阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:当阻塞队列是空时,从队列中获取元素的操作将会被阻塞当阻塞队列是满时,往队列里添加元素的操作将会被阻塞试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他线程往空的队列插入新的元素试图往满的阻塞队列中添加新元素的线程同样也会别阻塞,直到其他线程从队列中移除一个或多个元素或完全清空队列后是队列重原创 2020-07-06 21:22:06 · 5458 阅读 · 0 评论 -
【Java】--Synchronized和Lock的区别
目前在Java中存在两种锁机制:Synchronized和Lock,Lock接口及其实现类是JDK1.5增加的内容。本文将从不同角度分析两者的区别。区别1. 原始构成Synchronized 是关键字属于JVM层面monitorenter(底层是通过monitor对象来完成,其实wait/notify等方法也依赖monitor对象,只有在同步块或方法中才能掉wait/notify等方法)monitorexitLock 是具体的类,是API层面的锁2. 使用方法Synchronized原创 2020-07-06 21:21:21 · 5416 阅读 · 0 评论 -
【Java】--Semaphore的介绍及应用
Semaphore简介Semaphore是java.util.concurrent包下的同步工具,它通过维护若干个许可证来控制线程对共享资源的访问。Semaphore翻译成字面意思为 信号量, Semaphore所维护的许可证数量就是允许访问共享资源的最大线程数量,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。方法说明构造器// 参数permits表示许可数目,即同时可以允许多少线程进行访问public Semaphore(int permits原创 2020-07-01 19:40:02 · 5417 阅读 · 0 评论 -
【Java】--CyclicBarrier的介绍及应用
CyclicBarrier简介CyclicBarrier是java.util.concurrent包下的一个类,CyclicBarrier的字面意思是 可循环(Cyclic) 使用的 屏障(Barrier) 。CyclicBarrier能让一组线程到达一个屏障(也可叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会打开,所有被屏障拦截的线程才会继续干活,线程进入屏障通过CyclicBarrier的await()方法。CyclicBarrier会等齐其他线程在继续进行,即CyclicBarrie原创 2020-07-01 19:39:28 · 5500 阅读 · 0 评论 -
【Java】--CountDownLatch的介绍及应用
CountDownLatch简介CountDownLatch是java.util.concurrent包中的一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。它主要用来协调多个线程之间的同步,起到一个同步器的作用。总的来说,CountDownLatch让一个或多个线程在运行过程中的某个时间点能停下来等待其他的一些线程完成某些任务后再继续运行。使用场景在一些应用场合中,需要等待某个条件达到要求后才能做后面的事情;同时当线程都完成后也会触发事件,以便进行后面的操作。 这原创 2020-07-01 00:51:36 · 5643 阅读 · 0 评论 -
【Java】--锁概念总结
Java中锁的概念很多,各种各样的锁名称纷繁复杂,现总结下:公平锁/非公平锁公平锁:指多个线程按照申请锁的顺序来获取锁。类似排队打饭,先来后到非公平锁:指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。有可能,会造成优先级反转或者饥饿现象。饥饿现象指某个线程一直被后来线程抢占的现象对于ReentrantLock而言,通过构造函数指定该锁是否是公平锁,默认是非公平锁。Lock lock = new ReentrantLock();Reentrant原创 2020-06-30 23:14:18 · 5355 阅读 · 0 评论 -
【Java】--集合类的不安全问题总结
在高并发下,常用的Java集合就会出现许多问题,现总结如下:ArrayList在ArrayList的基础知识一文中我们知道:ArrayList是非线程安全的! 一般在单线程中才使用ArrayList。为什么ArrayList是非线程安全的?ArrayList中的方法都不加锁,比如add()// 将指定的元素插入ArrayList中的指定位置 public void add(int index, E element) { rangeCheckForAdd(index);原创 2020-06-30 00:03:24 · 5602 阅读 · 0 评论 -
【Java】--CAS中的ABA问题
ABA是什么一个线程one从内存位置V中取出A,这时候另一个线程two也从内存中取出A,并且two进行了一些操作变成了B,然后two又将V位置的数据变成A,这时候线程one进行CAS操作发现内存中仍然是A,然后one操作成功。尽管线程one的CAS操作成功,但是不代表这个过程就是没有问题的。...原创 2020-06-30 00:03:01 · 5371 阅读 · 0 评论 -
【Java】--CAS知道吗?
CAS是什么compare and swap,即比较并交换对于 Java 并发中的安全问题我们最常用的方式就是使用 synchronized 关键字了,但在上文中我们知道,volatile是轻量级的synchronized(不保证原子性),同样可以用volatile,为了保证原子性可以使用JUC包下的原子操作类。这些类就用到了CAS实现原子操作。以AtomicInteger 为例:public class CASDemo { public static void main(String[]原创 2020-06-28 21:22:19 · 5396 阅读 · 0 评论 -
【Java】--谈谈你对volatile的理解
1、volatile是JVM提供的轻量级的同步机制volatile的特性保证可见性禁止指令重排序在【JMM】–Java内存模型 一文中,可知为了保证内存可见性,Java 编译器在生成指令序列的适当位置会插入内存屏障指令来禁止特定类型的处理器重排序。被volatile关键字修饰的变量,在每个写操作之后,都会加入一条store内存屏障命令,此命令强制工作内存将此变量的最新值保存至主内存;在每个读操作之前,都会加入一条load内存屏障命令,此命令强制工作内存从主内存中加载此变量的最新值至工作内存。原创 2020-06-19 23:24:40 · 5361 阅读 · 0 评论 -
【JMM】--Java内存模型
Java内存模型即Java Memory Model,简称JMM。JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式。JVM是整个计算机虚拟模型,所以JMM是隶属于JVM的。如果我们要想深入了解Java并发编程,就要先理解好Java内存模型。Java内存模型定义了多线程之间共享变量的可见性以及如何在需要的时候对共享变量进行同步。原始的Java内存模型效率并不是很理想,因此Java1.5版本对其进行了重构,现在的Java8仍沿用了Java1.5的版本。并发编程模型的分类在并发编程原创 2020-06-09 01:48:20 · 5147 阅读 · 0 评论 -
【JVM】--体系结构及参数调优
1、JVM是啥Java虚拟机,是用来执行java字节码(二进制的形式)的虚拟计算机,运行在操作系统之上的,它与硬件没有直接的交互特点:跨平台编译之后的字节码文件和平台无关,一次编写,多处运行2、JVM体系结构ClassLoader类装载器,负责加载class文件,class文件在文件开头有特定的文件标示,将class文件字节码内容加载到内存中,并将这些内容转换成方法区中的...原创 2020-04-03 10:55:43 · 4746 阅读 · 0 评论 -
【Java】基础15
线程一、学习目标能够使用@FunctionalInterface注解能够自定义无参无返回函数式接口能够自定义有参有返回函数式接口能够理解Lambda延迟执行的特点能够使用Lambda作为方法的参数能够使用Lambda作为方法的返回值能够使用Supplier函数式接口能够使用Consumer函数式接口能够使用Function函数式接口能够使用Predicate函数式接口二、...原创 2020-03-31 23:48:59 · 4663 阅读 · 0 评论 -
【Java】基础14
day11【网络编程】主要内容软件架构CS/BS网络通信三要素TCP通信Socket套接字ServerSocket教学目标 能够辨别UDP和TCP协议特点 能够说出TCP协议下两个常用类名称 能够编写TCP协议下字符串数据传输程序 能够理解TCP协议下文件上传案例 能够理解TCP协议下案例2第一章 网络编程入门1.1软件结构C/S结构 :全称为Client/...原创 2020-03-31 23:14:32 · 4641 阅读 · 0 评论 -
【Java】基础13
day10【缓冲流、转换流、序列化流】主要内容缓冲流转换流序列化流打印流教学目标 能够使用字节缓冲流读取数据到程序 能够使用字节缓冲流写出数据到文件 能够明确字符缓冲流的作用和基本用法 能够使用缓冲流的特殊功能 能够阐述编码表的意义 能够使用转换流读取指定编码的文本文件 能够使用转换流写入指定编码的文本文件 能够说出打印流的特点 能够使用序列化流写出对象到文件...原创 2020-03-31 23:00:51 · 4664 阅读 · 0 评论 -
【Java】基础12
day09【字节流、字符流】主要内容IO流字节流字符流异常处理Properties教学目标 能够说出IO流的分类和功能 能够使用字节输出流写出数据到文件 能够使用字节输入流读取数据到程序 能够理解读取数据read(byte[])方法的原理 能够使用字节流完成文件的复制 能够使用FileWirter写数据到文件 能够说出FileWriter中关闭和刷新方法的区别 ...原创 2020-03-31 22:55:41 · 4587 阅读 · 0 评论 -
【Java】基础11
day08【File类、递归】主要内容File类递归教学目标 能够说出File对象的创建方式 能够说出File类获取名称的方法名称 能够说出File类获取绝对路径的方法名称 能够说出File类获取文件大小的方法名称 能够说出File类判断是否是文件的方法名称 能够说出File类判断是否是文件夹的方法名称 能够辨别相对路径和绝对路径 能够遍历文件夹 能够解释递归的含义...原创 2020-03-31 22:48:27 · 4590 阅读 · 0 评论 -
【Java】基础10
day07【线程池、Lambda表达式】主要内容等待与唤醒案例线程池Lambda表达式教学目标-[ ] 能够理解线程通信概念-[ ] 能够理解等待唤醒机制-[ ] 能够描述Java中线程池运行原理-[ ] 能够理解函数式编程相对于面向对象的优点-[ ] 能够掌握Lambda表达式的标准格式-[ ] 能够使用Lambda标准格式使用Runnable与Comparator接口...原创 2020-03-31 22:43:48 · 4594 阅读 · 0 评论 -
【Java】基础09
day06 【线程、同步】主要内容 线程同步线程状态教学目标 能够描述Java中多线程运行原理 能够使用继承类的方式创建多线程 能够使用实现接口的方式创建多线程 能够说出实现接口方式的好处 能够解释安全问题的出现的原因 能够使用同步代码块解决线程安全问题 能够使用同步方法解决线程安全问题 能够说出线程6个状态的名称 第一章 线程 1.1 多线程原理 昨天的时候我们已经写过一版多线程的代码,很多...原创 2020-03-31 22:36:33 · 4664 阅读 · 0 评论 -
【Java】基础08
day05 【异常、线程】主要内容异常、线程教学目标 能够辨别程序中异常和错误的区别 说出异常的分类 说出虚拟机处理异常的方式 列举出常见的三个运行期异常 能够使用try…catch关键字处理异常 能够使用throws关键字处理异常 能够自定义异常类 能够处理自定义异常类 说出进程的概念 说出线程的概念 能够理解并发与并行的区别 能够开启新线程第一章 ...原创 2020-03-31 16:52:13 · 4620 阅读 · 0 评论 -
【Java】基础07
day04 【Map】主要内容Map集合教学目标 能够说出Map集合特点 使用Map集合添加方法保存数据 使用”键找值”的方式遍历Map集合 使用”键值对”的方式遍历Map集合 能够使用HashMap存储自定义键值对的数据 能够使用HashMap编写斗地主洗牌发牌案例第一章 Map集合1.1 概述现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个...原创 2020-03-31 16:45:21 · 4535 阅读 · 0 评论 -
【Java】基础06
day03 【List、Set、数据结构、Collections】主要内容数据结构List集合Set集合Collections教学目标 能够说出List集合特点 能够说出常见的数据结构 能够说出数组结构特点 能够说出栈结构特点 能够说出队列结构特点 能够说出单向链表结构特点 能够说出Set集合的特点 能够说出哈希表的特点 使用HashSet集合存储自定义元素 ...原创 2020-03-31 16:31:30 · 4559 阅读 · 0 评论 -
【Java】基础05
一、Collection集合1.1 集合概述集合:集合是java中提供的一种容器,可以用来存储多个数据。集合和数组既然都是容器,它们有啥区别呢?数组的长度是固定的。集合的长度是可变的。数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不一致。在开发中一般当对象多的时候,使用集合进行存储。1.2 集合框架JAVASE提供了满足各种需求...原创 2020-03-25 15:37:14 · 4573 阅读 · 0 评论 -
【Java】基础04
一、Object类1.1 概述java.lang.Object类是Java语言中的根类,即所有类的父类。它中描述的所有方法子类都可以使用。在对象实例化的时候,最终找的父类就是Object。如果一个类没有特别指定父类, 那么默认则继承自Object类。例如:public class MyClass /*extends Object*/ { // ...}根据JDK源代码及Obje...原创 2020-03-25 11:03:25 · 4533 阅读 · 0 评论 -
【Java】基础03
1、finalfinal关键字代表最终、不可改变的。常见四种用法:可以用来修饰一个类可以用来修饰一个方法还可以用来修饰一个局部变量还可以用来修饰一个成员变量1. 修饰类当前这个类不能有任何的子类。(太监类)注意:一个类如果是final的,那么其中所有的成员方法都无法进行覆盖重写(因为没子类)2. 修饰方法当final关键字用来修饰一个方法的时候,这个方法就是最终方法,...原创 2020-03-24 22:42:46 · 4503 阅读 · 0 评论 -
【Java】基础02
面向对象三大特征封装继承多态1、封装将一些细节隐藏,对外界不可见在java中的体现:方法就是一种封装关键字private也是一种方法例如求数组的最大元素,可以将过程封装为一个方法getMax(),在main中只需调用该方法即可,无需关注具体细节public class GetMax { public static void main(String[...原创 2020-03-24 22:40:58 · 4526 阅读 · 0 评论 -
【Java】基础01
1、内存概述内存是计算机中的重要原件,临时存储区域,作用是运行程序。我们编写的程序是存放在硬盘中的,在硬盘中的程 序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存。Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。2、Java虚拟机的内存划分栈(Stack)存放的是方法中的局部变量方法运行一定在栈中运行局部变量:方法的参数,或者方法{}内部的变量...原创 2020-03-23 21:43:27 · 4525 阅读 · 0 评论 -
Java--native关键字
native是与C++联合开发的时候用的!java自己开发不用的! 使用native关键字说明这个方法是原生函数,也就是这个方法是用C/C++语言实现的,并且被编译成了DLL,由java去调用。 这些函数的实现体在DLL中,JDK的源代码中并不包含,你应该是看不到的。对于不同的平台它们也是不同的。这也是java的底层机制,实际上java就是在不同的平台上调用不同的native方法实现对操作系统...转载 2019-03-15 10:54:27 · 3288 阅读 · 0 评论 -
Java中堆内存(heap)和栈内存(stack)的区别
在Java代码中,常常会使用到这样的类的声明实例化:Person per = new Person();//这其实是包含了两个步骤,声明和实例化Person per = null; //声明一个名为Person类的对象perper = new Person(); // 实例化这个per对象声明 指的是创建类的对象的过程;实例化 指的是用关键词new来开辟内存空间。它们...转载 2019-02-26 19:10:47 · 3420 阅读 · 0 评论 -
Java中内存分配策略及堆和栈的比较
Java中内存分配策略及堆和栈的比较 内存分配策略 按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. 静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间.这种分配策略要求程序代码中不允许有可变数据结构(比如可变数组)的存在,也不允许有嵌套或者递归的结构出现,因为它们都会导致编...转载 2019-02-26 18:56:37 · 4183 阅读 · 0 评论 -
Java堆、栈和常量池详解
Java堆、栈和常量池详解1. 栈(stack)与堆(heap)都是Java用来在RAM中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。2. 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共 享,详见第3点。 堆的优势是可以动态地分配内存大小,...转载 2019-02-26 18:49:47 · 3280 阅读 · 0 评论 -
JAVA中数据存储
在JAVA中,有六个不同的地方可以存储数据1. 寄存器(register)。 这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部。但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配。你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象。 ------最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.2. 堆栈(stack)。位于通用RAM...转载 2019-02-26 18:47:15 · 5029 阅读 · 0 评论