JDK

Java 面试知识点解析(三)——JVM篇

你离开我真会死。 提交于 2020-11-04 02:37:35
前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文: 知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大部分内容参照自这一篇文章,有一些自己补充的,也算是重新学习一下 Java 吧。 前序文章链接: Java 面试知识点解析(一)——基础知识篇 Java 面试知识点解析(二)——高并发编程篇 (一)JVM 基础知识 问题和答案都是自行整理的,所以仅供参考!欢迎指正! 1)Java 是如何实现跨平台的? 注意:跨平台的是 Java 程序,而不是 JVM。JVM 是用 C/C++ 开发的,是编译后的机器码,不能跨平台,不同平台下需要安装不同版本的 JVM 答:我们编写的 Java 源码,编译后会生成一种 .class 文件,称为字节码文件。Java 虚拟机(JVM)就是负责将字节码文件翻译成特定平台下的机器码然后运行,也就是说,只要在不同平台上安装对应的 JVM,就可以运行字节码文件,运行我们编写的 Java 程序。 而这个过程,我们编写的 Java 程序没有做任何改变,仅仅是通过 JVM 这一 “中间层” ,就能在不同平台上运行,真正实现了 “一次编译,到处运行” 的目的。 2)什么是 JVM ? 解析:不仅仅是基本概念,还有 JVM 的作用。 答:JVM,即 Java Virtual

初识中间件Kafka

泪湿孤枕 提交于 2020-11-04 00:04:41
初识中间件Kafka Author:SimplelWu 什么是消息中间件? 非底层操作系统软件,非业务应用软件,不是直接给最终用户使用的,不能直接给客户带来价值的软件统称为中间件 关注于数据的发送和接收,利用高效可靠的异步消息传递机制集成分布式系统。 什么是Kafka? Kafka是一种高吞吐量的分布式发布订阅消息系统,是一个分布式的、分区的、可靠的分布式日志存储服务。它通过一种独一无二的设计提供了一个消息系统的功能。 kafka官方: http://kafka.apache.org/ Kafka作为一个分布式的流平台,这到底意味着什么? 我们认为,一个流处理平台具有三个关键能力: 发布和订阅消息(流),在这方面,它类似于一个消息队列或企业消息系统。 以 容错 的方式存储消息(流)。 在消息流发生时处理它们。 什么是kakfa的优势? 它应用于2大类应用: 构建实时的流数据管道,可靠地获取系统和应用程序之间的数据。 构建实时流的应用程序,对数据流进行转换或反应。 kafka有四个核心API 应用程序使用 Producer API 发布消息到1个或多个topic(主题)。 应用程序使用 Consumer API 来订阅一个或多个topic,并处理产生的消息。 应用程序使用 Streams API 充当一个流处理器,从1个或多个topic消费输入流

MySQL 主从复制

╄→尐↘猪︶ㄣ 提交于 2020-11-03 16:45:15
MySQL主从复制与读写分离 在实际的生产环境中,如果数据库的读和写都在同一个数据库服务中操作,无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的,因此,一般来说都是通过主从复制的方式来同步数据,在通过读写分离来提升数据库的并发负载能力这样的的方案来进行部署与实施的。 Mysql主从复制原理: Mysql的主从复制和mysql的读写分离两者有着紧密联系,首先要部署主从复制,只有主从复制完成了 ,才能在此基础上进行数据的读写分离。 Mysql支持的复制类型: 基于语句的复制:在主服务器上执行的SQL语句,在从服务器上执行同样的语句。默认采用,效率高。 基于行的复制:把改变的内容复制过去,而不是把命令在从服务器上执行一遍。 混合类型的复制:默认采用基于语句的复制,当无法精确复制时,就会采用基于行的复制。 复制到工作过程: 事务更新Master记录二进制日志(Binary log) Slave将Master的Binary log复制到其中继日志 Slave开始一个I/O线程,在Master上打开一个普通连接,然后开始Binlog dump process(binlogz转储过程),Binlog dump process 从Master的二进制日志中读取事件,写入Relay log(中继日志)中; SQL slave thread (SQL从线程)从中继日志读取时间

马士兵并发编程学习笔记

梦想与她 提交于 2020-11-03 16:29:30
<div class="htmledit_views"> <span></span><div><br></div><div><span style="font-size:18pt;">(一)</span></div><div style="padding:8px;font-family:Monaco, Menlo, Consolas, 'Courier New', monospace;font-size:12px;color:rgb(51,51,51);background-color:rgb(251,250,248);border:1px solid rgba(0,0,0,.15);"><div><span style="font-size:18pt;"><span style="color:rgb(0,0,128);font-family:Monaco;"><strong>public class</strong></span> <span style="font-family:Monaco;color:rgb(51,51,51);">Demo01 {</span></span></div><div><br style="font-family:Monaco;color:rgb(51,51,51);"></div><div><span style="font-size:18pt

synchronized 关键字5连击

大城市里の小女人 提交于 2020-11-03 16:20:00
说说自己对synchronized关键字的理解 synchronized关键字解决的是多个线程之间的访问资源的互斥性,synchronized可以保证被它修饰的方法或者代码块在任意时刻只有一个线程执行 在早期的Java版本中,synchronized属于重量级锁,效率低下,因为监视器锁是依赖于底层的操作系统的Mutex Lock来实现的,Java的线程是映射到操作系统的原生线程之上的。如果要挂起或者唤醒一个线程,都需要操作系统帮忙完成,而实现操作系统之间的切换时需要从用户态转换到内核态,这个状态转换就需要相对较长的时间来完成,时间成本相对较高,这也就是为什么早期的synchronized效率底下的原因。在Java6之后Java 官方对JVM层面对synchronized较大优化,所以现在的synchronized锁效率也优化的不错了。jdk1.6对锁的实现引入了大量的优化,如自旋锁、适应性自旋锁、消除锁、锁粗化、偏向锁、轻量级锁等技术来减少锁操作的开销。 说说自己是怎么使用synchronized关键字的 在项目中用到了么? synchronized关键字主要有三种使用形式: * 作用于当前实例加锁,进入同步代码块前要获得当前对象实例的锁 * 修饰静态方法 作用于当前类对象加锁,进入同步代码块前首先要获得当前类对象的锁。 * 修饰代码块,指定锁对象,对给定对象加锁

来自【阿里内部】并发编程学习笔记解密分享

前提是你 提交于 2020-11-03 15:59:13
目录 一、引言 二、JDK提供的原生线程池 三、深入源码剖析线程池工作原理 execute: addWoker: 四、深入源码分析线程池线程复用原理 五、自定义线程池实战 五、线程池参数合理配置 六、参考 一、引言 一般在开发过程中,一个功能是运行时长太久了,一般是通过什么方式去优化的? 异步/多线程,对于一个业务方法而言,如果其中的调用链太长势必会引起程序运行时间延长,导致整个系统吞吐来量下降,而我们使用多线程方式来对该方法的调用链进行优化,对于一些耦合度不是特别高的调用关系可以直接通过多线程来走异步的方式进行处理,大大的缩短了程序的运行时长,但是如果我们的多线程创建方式是通过 new Thread(); 这种方式去进行显式创建的话它真的可以吗?答案是不可以,Why?答案如下: 如果在生产环境使用 new Thread(); 这种方式去进行显式创建线程会带来什么后果? 1. OOM: 如果当前方法突遇高并发情况,假设此时来了1000个请求,而按传统的网络模型是BIO,此时服务器会开1000个线程来处理这1000个请求(不考虑WEB容器的最大线程数配置),当1000个请求执行时又会发现此方法中存在 new Thread(); 创建线程,此时每个执行请求的线程又会创建一个线程,此时就会出现1000*2=2000个线程的情况出现,而在一个程序中创建线程是需要向JVM申请内存分配的

在Linux服务器中安装JDK8

微笑、不失礼 提交于 2020-11-03 11:24:52
Java Development Kit (JDK) 是Sun公司(已被Oracle收购)针对Java开发员的软件开发工具包。自从Java推出以来,JDK已经成为使用最广泛的Java SDK(Software development kit)。 一、使用安装包安装 官网: https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html 1.进入官网,下载安装包。 目前在官网下载低于jdk1.8的java jdk的时候需要登陆,这边分享一个账号,方便下载 账号:2696671285@qq.com 密码:Oracle123 账号提供者:https://blog.csdn.net/WNsshssm/article/details/84315519 2.把JDK安装包上传到Linux服务器上。 mac:建议使用FileZilla进行上传。 window:建议使用Xshell进行上传。 具体上传步骤可以请百度。 3.解压安装包。 tar -zxvf jdk-8u271-linux-x64.tar.gz 建议:解压后删除压缩包,这里我们已经删除了压缩包。 4.配置环境变量。 vim /etc/profile 添加以下内容: export JAVA_HOME=/home/jdk1.8.0_271 export

30道 有趣的 的 JVM 面试题

百般思念 提交于 2020-11-03 09:06:00
[toc] 前段时间在忙大数据,也对市场技术有了一个新的理解,学到老,学到老嘛。今天来和大家分享一下JVM常见的面试题,今天来和大家分享一下。大多都是大厂的实战面试题,来和小刘看一下吧! 1、JVN内存结构 方法区和对是所有线程共享的内存区域;而java栈、本地方法栈和程序员计数器是运行是线程私有的内存区域。 Java堆(Heap),是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。 方法区(Method Area),方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。 程序计数器(Program Counter Register),程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。 JVM栈(JVM Stacks),与程序计数器一样,Java虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame

Java核心技术之什么是泛型

大城市里の小女人 提交于 2020-11-03 09:03:54
什么是泛型?我们在工程代码中一定看过T,K,V等等,这个就是泛型了,那我们看看官网是怎么说的这个@泛型(Generic) When you take an element out of a Collection , you must cast it to the type of element that is stored in the collection. Besides being inconvenient, this is unsafe. The compiler does not check that your cast is the same as the collection's type, so the cast can fail at run time. Generics provides a way for you to communicate the type of a collection to the compiler, so that it can be checked. Once the compiler knows the element type of the collection, the compiler can check that you have used the collection consistently and can

Java内存模型(JMM)

淺唱寂寞╮ 提交于 2020-11-03 05:29:36
1.什么是Java内存模型 Java内存模型定义了线程和内存的交互方式,在JMM抽象模型中,分为主内存、工作内存;主内存是所有线程共享的,一般是实例对象、静态字段、数组对象等存储在堆内存中的变量。工作内存是每个线程独占的,线程对变量的所有操作都必须在工作内存中进行,不能直接读写主内存中的变量,线程之间的共享变量值的传递都是基于主内存来完成。 2.JMM中的8个原子操作 lock(锁定):作用于主内存的变量,把一个变量标识为一条线程独占状态。 unlock(解锁):作用于主内存变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定。 read(读取):作用于主内存变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作使用 load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中。 use(使用):作用于工作内存的变量,把工作内存中的一个变量值传递给执行引擎,每当虚拟机遇到一个需要使用变量的值的字节码指令时将会执行这个操作。 assign(赋值):作用于工作内存的变量,它把一个从执行引擎接收到的值赋值给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作。 store(存储):作用于工作内存的变量,把工作内存中的一个变量的值传送到主内存中,以便随后的write的操作。 write(写入)