JDK

开源日志管理平台ELK Stack 7.9.0 部署

青春壹個敷衍的年華 提交于 2020-10-03 11:11:14
环境介绍 为简化安装和升级,Elastic Stack各组件版本是同步发布的。本次安装,采用最新的7.9通用版。官方有多种安装方式:tar、rpm、docker、yum形式,我选择用tar包安装。 Elastic Stack 组件: Beats7.9 (filebeat) Elasticsearch7.9 Kibana7.9 Logstash7.9 操作系统:CentOS8.2.2004 JDK版本:jdk-14.0.2_linux-x64_bin.rpm(Logstash依赖JDK) Redis版本:5.0.3 (yum 安装) 下载地址: https://artifacts.elastic.co/downloads/kibana/kibana-7.9.0-linux-x86_64.tar.gz https://artifacts.elastic.co/downloads/logstash/logstash-7.9.0.tar.gz https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.9.0-linux-x86_64.tar.gz https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.9.0-linux-x86_64

啥?HashMap 1.8 还有死循环?你逗我呢!

点点圈 提交于 2020-10-03 07:19:27
是否你听说过JDK8之后HashMap已经解决的扩容死循环的问题,虽然HashMap依然说线程不安全,但是不会造成服务器load飙升的问题。 然而事实并非如此。少年可曾了解一种红黑树成环的场景,=v= 今日,在查看监控时候发现,某一台机器load飙升 感觉问题不对劲,ssh大法登陆机器,top,top -Hp,jstack,jmap四连击保存下来堆栈,cpu使用最高的线程,内存信息准备分析。 首先查看使用最耗费cpu的线程堆栈信息 cat stack | grep -i 34670 -C10 --color 我勒个去,HashMap,猜测八成死循环了,但是我们使用的JDK8,在8中通过栈封闭的链表替换,解决了扩容死循环的问题。疑惑,继续往下看。 根据堆栈信息,root方法是问题所在,点开HashMap源码 好嘛,load飙高,代码有个for语句,我觉得铁定死循环了,看代码情况只可能是两个红黑树节点的父亲节点相互引用才可以导致无法走出这个for语句。 然而这都是我的猜测,我没有证据。而且让我追红黑树的代码,也是需要耗费大量时间的事情,我需要快速验证我的猜测。 我之前dump下来了堆内存信息,我通过jhat 命令生成html的内存信息页面 然后输入http://localhost:7000查看。 我先找业务代码中持有这个HashMap的对象,然后点进去查询内部信息

mybatis之foreach用法

十年热恋 提交于 2020-10-03 06:36:55
在做mybatis的mapper.xml文件的时候,我们时常用到这样的情况:动态生成sql语句的查询条件,这个时候我们就可以用mybatis的foreach了 foreach元素的属性主要有item,index,collection,open,separator,close。 item: 集合中元素迭代时的别名,该参数为必选。 index :在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选 open :foreach代码的开始符号,一般是(和close=")"合用。常用在in(),values()时。该参数可选 separator :元素之间的分隔符,例如在in()的时候,separator=","会自动在元素中间用“,“隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样。该参数可选。 close: foreach代码的关闭符号,一般是)和open="("合用。常用在in(),values()时。该参数可选。 collection: 要做foreach的对象,作为入参时,List对象默认用"list"代替作为键,数组对象有"array"代替作为键,Map对象没有默认的键。当然在作为入参时可以使用@Param("keyName")来设置键,设置keyName后,list,array将会失效。 除了入参这种情况外

太赞了!墙裂推荐这款网页版 Nginx 配置生成器,好用到爆!

。_饼干妹妹 提交于 2020-10-03 05:19:14
之前民工哥也给大家介绍过一款Nginx配置生成器: 强大!Nginx 配置在线一键生成“神器” ,不太了解的人可以去看一看。 最近民工哥又发现一款好用的网页版开源工具,同样它的功能也是Nginx配置生成器,功能非常强大,方便实用,它是: NginxWebUI 。 NginxWebUI介绍 NginxWebUI是一款方便实用的 nginx 网页配置工具 ,可以使用 WebUI 配置 Nginx 的各项功能,包括 端口转发,反向代理,ssl 证书配置,负载均衡 等,最终生成「nginx.conf」配置文件并覆盖目标配置文件,完成 nginx 的功能配置。 项目地址:https://gitee.com/cym1102/nginxWebUI 官方网站:https://nginxwebui.gitee.io NginxWebUI功能说明 该项目是基于springBoot的web系统,数据库使用sqlite,因此 服务器上不需要安装任何数据库。 本项目可管理多个nginx服务器集群, 随时一键切换到对应服务器上进行nginx配置, 也可以一键将某台服务器配置同步到其他服务器, 方便集群管理。 nginx本身功能复杂, 本项目并不能涵盖nginx所有功能, 只能配置常用功能, 更高级的功能配置仍然需要在最终生成的nginx.conf中进行手动编写。 部署此项目后,

AQS底层原理分析

廉价感情. 提交于 2020-10-03 05:15:38
juc 1)synchronized实践中的问题: 锁的获得、锁的释放,不够灵活--》Lock的出现 2)Lock是一个接口: 意味着这是一个标准,有很多种实现。 重入锁,读写锁。 3)ReentrantLock: 重入的含义:获得锁时,再次去获得锁,只用记录次数就行,而不会阻塞。 synchronized 和 ReentrantLock 重入是为了解决死锁问题的。 4) AQS Sync 公平锁 非公平锁 5)ReentrantLock重入互斥锁 6)ReentrantReadWriteLock: 只是读的话,是不需要加锁的。 读多写少时可以提升性能。 只有读的时候,不会阻塞。 而A线程在写,B线程想去读取的时候,就会阻塞。 原因是: 必须保证B获取到的值是A写入的值。 写写、读写 就会互斥。 而 读读是不会互斥的。 7)ReentrantLock的实现: 当一个线程竞争锁的时候,其它线程怎么办? 按照我们之前的理解,必然是阻塞。那么如何实现的? 同步队列。 8)AQS有2种功能: 独占: 独占是互斥。 共享: 共享就是读写锁。 9)AQS的基本实现: 维护了一个双向链表。线程竞争失败时,被封装为Node(pre、next)节点加入,Node就是抢占锁失败的线程。 10)锁的基本要素: jvm层面的CAS,调用unsafe层面的东西 11)非公平锁: 允许插队 公平锁:

Java基础知识面试题

给你一囗甜甜゛ 提交于 2020-10-03 04:51:13
一、JDK 和 JRE 有什么区别? JDK(Java Development Kit),Java开发工具包 JRE(Java Runtime Environment),Java运行环境 JDK中包含JRE,JDK中有一个名为jre的目录,里面包含两个文件夹bin和lib,bin就是JVM,lib就是JVM工作所需要的类库。 二、== 和 equals 的区别是什么? 对于基本类型,==比较的是值; 对于引用类型,==比较的是地址; equals不能用于基本类型的比较; 如果没有重写equals,equals就相当于==; 如果重写了equals方法,equals比较的是对象的内容; 三、final 在 java 中有什么作用? final修饰的成员变量,必须在声明的同时赋值,一旦创建不可修改; final修饰的方法,不能被子类重写; final类中的方法默认是final的; private类型的方法默认是final的; 四、java 中的 Math.round(-1.5) 等于多少? Math提供了三个与取整有关的方法:ceil、floor、round 1、ceil:向上取整; Math.ceil(11.3) = 12; Math.ceil(-11.3) = 11; 2、floor:向下取整; Math.floor(11.3) = 11; Math.floor(-11.3) =

CentOS 安装 Jenkins

爷,独闯天下 提交于 2020-10-03 03:12:41
1、实验环境 CentOS-7.5 VMware虚拟机一台 CPU1核,内存1G,磁盘20G Jenkins服务器IP:10.0.11.193 jdk 1.8 安装包 jenkins是基于Java开发的持续集成工具,因此必须安装java环境 2、安装java环境 先用FTP软件或者rz命令上传jdk-1.8到linux [root@jenkins ~]# [root@jenkins ~]#rz #上传jdk [root@jenkins ~] # ll [root@jenkins ~]#tar xf jdk-8u251-linux-x64.tar.gz -C /usr/local/ 解压jdk到/usr/local/ [root@jenkins jdk1.8.0_251]# vim /etc/profile #设置java环境变量 #在配置文件最末尾添加以下内容即可 export JAVA_HOME=/usr/local/jdk1.8.0_251 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH [root@jenkins ~]# source /etc/profile #使环境比那里立即生效

JVM源码分析之Object.wait/notify(All)完全解读

安稳与你 提交于 2020-10-03 01:47:10
本文来自: PerfMa技术社区 PerfMa(笨马网络)官网 概述 本文其实一直都想写,因为各种原因一直拖着没写,直到开公众号的第一天,有朋友再次问到这个问题,这次让我静心下来准备写下这篇文章,本文有些东西是我自己的理解,比如为什么JDK一开始要这么设计,初衷是什么,没怎么去找相关资料,所以只能谈谈自己的理解,所以大家看到文章之后可以谈谈自己的看法,对于实现部分我倒觉得说清楚问题不大,code is here,看明白了就知道怎么回事了。 Object.wait/notify(All)大家都知道主要是协同线程处理的,大家用得也很多,大概逻辑和下面的用法差不多 看到上面代码,你会有什么疑惑吗?至少我会有几个问题会问自己: * 为什么进入wait和notify的时候要加synchronized锁 * 既然加了synchronized锁,那当某个线程调用了wait的时候明明还在synchronized块里,其他线程怎么进入到锁里去执行notify的 * 为什么wait方法可能会抛出InterruptedException异常 * 如果有多个线程都进入wait状态,那某个线程调用notify唤醒线程时是否按照顺序唤起那些wait线程 * wait的线程是在某个线程执行完notify之后立马就被唤起吗 * notifyAll又是怎么实现全唤起的 * wait的线程是否会影响load

1.对Java平台的理解。“Java是解释执行”对吗

我只是一个虾纸丫 提交于 2020-10-03 00:21:20
Java本身是一种面向对象的语言,最显著的特性有两个方面,一是所谓的“书写一次,到处运行”,能够非常容易地获得跨平台能力; 另外就是垃圾收集(GC),Java通过垃圾收集器(Garbage Collector)回收分配内存,大部分情况下,程序员不需要自己操心内存的分配和回收。 对于“Java是解释执行”这句话,说法不太准确。 我们开发的Java的源代码,首先 通过Javac编译成为字节码(bytecode),然后,在运行时,通过Java虚拟机(JVM)内嵌的解释器将字节码 解释执行 ,转换成为最终的机器码 。 但是常见的JVM,比如我们大多数情况使用的Oracle JDK提供的Hotspot JVM,都提供了JIT(Just-In-Time)编译器,也就是通常所说的动态编译器, JIT能够在运行时将热点代码编译成机器码 ,这种情况下部分热点代码就属于 编译执行,而不是解释执行了。 Javac的编译,编译Java源码生成“.class”文件里面实际是字节码,而不是可以直接执行的机器。 Java通过字节码和Java虚拟机(JVM)这种跨平台的抽象,屏蔽了操作系统和硬件的细节,这也是实现“一次编译,到处执行”的基础。 在运行时,JVM会通过类加载器(Class-Loader)加载字节码,解释或者编译执行 。 主流Java版本中,如JDK 8实际是解释和编译混合的一种模式,即所谓的混合模式

java学习笔记-Map集合中的HashMap集合与Hashtable

假如想象 提交于 2020-10-02 23:41:14
目 录 HashMap集合(非线程安全的) 两个重要方法put、get(重点) 为什么哈希表的随机增删、查询效率都高? HashMap集合的部分特点 HashMap的初始化默认容量 关于HashMap的equals方法和hashCode方法 拓展 Hashtable集合(线程安全的) HashTable和HashMap的部分区别 HashTable的初始化容量 Properties HashMap集合(非线程安全的) HashMap集合底层是哈希表/散列表的数据结构(哈希表是一个数组和单向链表的结合体) HashMap底层有三个值:hash key value next (哈希表:是一个一维数组,数组中每个元素是一个单链表) 两个重要方法put、get(重点) 两个重要方法put、get 存:map.put(k,v)实现原理:(掌握) 第一步:先将k,v封装到Node对象中 第二步:底层会调用k的hashCode()方法得出hash值,然后通过哈希算法,将hash值转换成数组的下标,下标位置上如果没有任何元素,就把Node添加到这个位置上。如果下标对应位置上有链表,此时会拿着k和链表上每页节点的k进行equals,如果所有的equals方法返回的都是false,那么这个新节点被添加到这个链表的的末尾。如果其中有一个equals返回的true,那么这个节点value将会被覆盖  取