JDK

JAVA运行时数据区域

和自甴很熟 提交于 2020-12-18 04:24:23
根据《Java 虚拟机规范(Java SE 7版)》规定,Java虚拟机所管理的内存将会包括一下几个运行时数据区域: 1.程序计数器 程序计数器(Program Counter Register) 是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条执行字节码指令。 每条线程都有一个独立的程序计数器。 如果执行的是java方法,这个计数器记录的是正在执行的虚拟机字节码指令地址。如果是native方法,计数器为空。此内存区域是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。 2.Java虚拟机栈 同样是线程私有,描述Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。一个方法对应一个栈帧。 局部变量表存放了各种基本类型、对象引用和returnAddress类型(指向了一条字节码指令地址)。其中64位长度long 和 double占两个局部变量空间,其他只占一个。 规定的异常情况有两种:1.线程请求的栈的深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;2.如果虚拟机可以动态扩展,如果扩展时无法申请到足够的内存

【并发编程】【JDK源码】J.U.C--AQS (AbstractQueuedSynchronizer)(1/2)

99封情书 提交于 2020-12-18 03:15:46
##J.U.C实现基础 AQS、非阻塞数据结构和原子变量类(java.util.concurrent.atomic包中的类),concurrent包中的基础类都是使用这种模式来实现的。而concurrent包中的高层类又是依赖于这些基础类来实现的。从整体来看,concurrent包的实现示意图如下: Java中的许多可阻塞类,例如ReentrantLock、Semaphore、ReentrantReadWriteLock、CountDownLatch等,都是基于AQS构建的。 注:在jdk 1.8.0_111源码中FutureTask不是基于AQS的,而是基于CAS FutureTask源码注释: /* * Revision notes: This differs from previous versions of this * class that relied on AbstractQueuedSynchronizer, mainly to * avoid surprising users about retaining interrupt status during * cancellation races. Sync control in the current design relies * on a "state" field updated via CAS to

Java并发编程-synchronized

心不动则不痛 提交于 2020-12-18 02:16:48
1、 为什么会用到 synchronized   Java语言的一个高级特性就是支持多线程,线程在操作系统的实现上,可以看成是轻量级的进程,同一进程中的线程都将共享进程的内存空间,所以Java的多线程在共享JVM的内存空间。JVM的内存空间主要分为:程序计数器、虚拟机栈、本地方法栈、堆、方法区和运行时常量池。   在这些内存空间中,我们重点关注栈和堆,这里的栈包括了虚拟机栈和本地方法栈(实际上很多JVM的实现就是两者合二为一)。在JVM中,每个线程有自己的栈内存,其他线程无法访问该栈的内存数据,栈中的数据也仅仅限于基本类型和对象引用。在JVM中,所有的线程共享堆内存,而堆上则不保存基本类型和对象引用,只包含对象。除了重点关注的栈和堆,还有一部分数据存放在方法区,比如类的静态变量,方法区和栈类似,只能存放基本类型和对象引用,不同的是方法区是所有线程共享的。   如上所述,JVM的堆(对象信息)和方法区(静态变量)是所有线程共享的,那么多线程如果访问同一个对象或者静态变量时,就需要进行管控,否则可能出现无法预测的结果。为了协调多线程对数据的共享访问,JVM给每个对象和类都分配了一个锁,同一时刻,只有一个线程可以拥有这个对象或者类的锁。JVM中锁是通过监视器(Monitors)来实现的,监视器的主要功能就是监视一段代码,确保在同一时间只有一个线程在执行。每个监视器都和一个对象关联

【Hadoop学习之四】HDFS HA搭建(QJM)

我只是一个虾纸丫 提交于 2020-12-18 01:59:16
环境   虚拟机:VMware 10   Linux版本:CentOS-6.5-x86_64   客户端:Xshell4   FTP:Xftp4   jdk8   hadoop-3.1.1 由于NameNode对于整个HDFS集群重要性,为避免NameNode单点故障,在集群里创建2个或以上NameNode(不要超过5个),保证高可用。 实现主备NameNode需要解决的问题: 1、通过JournalNodes来保证Active NN与Standby NN之间的元数据同步 2、通过ZKFC来保证Active NN与Standby NN主备切换 3、DataNode会同时向Active NN与Standby NN上报数据块的位置信息 参考: hdfs HA原理及安装 Hadoop组件之-HDFS(HA实现细节) HDFS HA: 高可靠性分布式存储系统解决方案的历史演进 搭建HA集群部署节点清单: 一、平台软件环境 1、平台:GNU/Linux 2、软件:jdk+免密登录 3、JAVA和Hadoop环境变量以及主机名设置 参考: 【Hadoop学习之三】Hadoop全分布式安装 二、配置(node1-node4采用相同配置) 1、hadoop-env.sh export JAVA_HOME=/usr/local/jdk1. 8 .0_65 export HDFS_NAMENODE

2020这一年总结出来的Java面试题,常频面试题大汇总~

≡放荡痞女 提交于 2020-12-17 21:33:43
面试就是大家身边总是存在各种各样的可能,而自身又具备这样的能力,就忍不住想试一试,尤其是到了年关,是一个好的蓄势并且认真积累的阶段。当然面试套路众多,但对于技术面试来说,主要是考察一个人的技术能力和沟通能力。不同类型的面试官根据自身的理解问的问题也不尽相同,没有规律可循。 “面试造火箭,工作拧螺丝”首先咱得能拧,才有造火箭的可能啊,这一年整理很多面试的高频问点也做了解析,今天在这分享给大家! 博主已将以下这些面试题整理成了一个Java面试手册,是PDF版的。 需要本资料全部面试题的,可以点击这里!!暗号ky! Java语法基础 1.面向对象和面向过程的区别 面向过程 优点: 性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗 资源;比如单片机、嵌入式开发、Linux/Unix 等一般采用面向过程开发,性能是 最重要的因素。 缺点: 没有面向对象易维护、易复用、易扩展 面向对象 优点: 易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特 性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护 缺点: 性能比面向过程低 Java 语言有哪些特点 1. 简单易学; 2. 面向对象(封装,继承,多态); 3. 平台无关性( Java 虚拟机实现平台无关性); 4. 可靠性; 5. 安全性; 6. 支持多线程( C++ 语言没有内置的多线程机制

centos7.5安装openjdk11

ⅰ亾dé卋堺 提交于 2020-12-17 17:23:35
1:搜索安装包 yum search java-11-openjdk 2:安装jdk11 yum install -y java-11-openjdk 3:查看当前版本 java -version 4:设置JAVA_HOME (一)找到JAVA安装目录 方式一 ls -l $(which java) 方式二 which java 如果显示的是 /usr/bin/java 请执行下面步骤 ls -lr /usr/bin/java 输出应为: /usr/bin/java -> /etc/alternatives/java ls -lrt /etc/alternatives/java 输出: /etc/alternatives/java -> /usr/lib/jvm/java-11-openjdk-11.0.3.7-0.el7_6.aarch64/jre/bin/java 上面的 /usr/lib/jvm/java-11-openjdk-11.0.3.7-0.el7_6.aarch64 就是JAVA的安装路径 (二)设置 1):编辑环境变量的配置文件 vi /etc/profile 2):在文件底部加入以下配置 export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.3.7-0.el7_6.aarch64 export JRE_HOME=

HashMap面试题汇总(附2020年最新大厂面试题、答案)

南楼画角 提交于 2020-12-17 15:48:10
1,HashMap底层存储结构 HashMap在Jdk1.7的时候采用的是数组加链表的数据结构,jdk1.8之后采用了数组加链表加红黑树的数据结构。观察源码可知HashMap类中有一个非常重要的字段就是Node[] table,即哈希桶数组。而Node是HashMap的一个内部类,实现了Map.Entry接口,本身就是一个键值对。 2,解决Hash冲突的方法,HashMap采用了什么方法解决Hash冲突? HashMap使用哈希表来存储数据的,当然哈希表不可避免的就会遇到hash冲突问题,解决hash冲突的方法大致有两种:1,开放地址法。2,链地址法。 1,开放地址法:当地址发生冲突时,按着某种方法继续探测哈希表中的其他存储单元,直到找到空位置为止。 2,链地址法:链地址法就是数组加链表的结合,在每一个数组元素上都有一个链表结构,当地址发生冲突时就讲数据存放在链表中。 而HashMap就是采用链地址法进行解决hash冲突的。 3,jdk1.8的HashMap中的链表达到多少个时会生成红黑树? HashMap用链地址法解决hash冲突,则当链表里的长度太长就会严重影响HashMap的性能。于是在jdk1.8里,对数据结构做了进一步优化,引入了红黑树,当链表长度大于8的时候,链表就会转成红黑树,利用红黑树快速增删改查的特点提高HashMap的性能,其中会用到红黑树的插入、删除

ArrayList 集合的几种遍历的方法

心已入冬 提交于 2020-12-17 15:39:11
ArrayList 集合 也可称作动态数组(长度可变),在新建的时候是 没有默认长度 的,在新增数据长度小于10的时候,ArrayList 的长度会自动设置为10 //了解更多可以 按住Ctrl 再点击你需要查看的方法或者类名 , 查看List 源代码 ,ArrayList 源代码 public static void main (String[] args) throws Exception { Arraylist 新增数据时长度是10 当长度为10的时候 增长是如何增长的? 增长因子数位0.5倍,向下取整数。 ArrayList arr= new ArrayList(); arr.add("a");//给集合赋值 arr.add("b"); arr.add("c"); arr.add("d"); arr.add("e"); System.out.println(arr.size()); //ArrayList 集合可以有重复对象 System.out.println("-------下标输出方式"); //下标输出方式 for(int i=0;i<arr.size();i++) { System.out.println(arr.get(i)); } System.out.println("-------foreach输出(jdk>1.5)"); //foreach输出(jdk>

阿里秋招内推1.2.3面面经(Java后台)

女生的网名这么多〃 提交于 2020-12-17 15:35:34
【每日一语】生活并没有那么复杂,要是你喜欢,大可以说我是在探索生命。——《本杰明•巴顿奇事》 offer已经算是有了,回馈牛客,在牛客网上我也学习到了很多大家分享出来的东西,是时候把自己秋招的面经分享出来积累人品了,最近在做一个人生中最重要的决定,希望结果是好的,攒人品!攒人品!攒人品!重要的话要说三遍!!! 一面,全程一个小时左右: 一上来先说自己实习做的项目,然后面试官开始问项目细节,然后又开始说学校里做的项目,这两个加起来就快四十分钟了,因为每个人项目不一样就不介绍跟项目关系太大的,说几个通用型问题1:为什么你的缓存更新策略是先更新数据库后删除缓存,讲讲其他的情况有什么问题 2:两个线程打印 1.2.3.4 打印到100怎么实现,这里刚开始说的是加锁用生产者消费者来做,后来说了semaphore,感觉后面的才是面试官想要的答案。 3:spring的aop的实现方式,aspectj和jdk动态代理,cglib动态代理,讲了下实现的原理 4:hashmap实现原理,把知道的都说出来。 二面,在周二,也是一个多小时,一来还是说的实习项目,然后直接问问题 1.缓存的使用策略和从底层数据库开始往上各个层级中缓存的使用,把你知道的都说出来,这个问题刚开始有点懵逼,后来就从数据库底层原理开始说起,然后讲了缓存的各种使用策略,和这些策略避免的什么问题,这里讲了好久,边说边被追问

为什么大厂面试,都喜欢考算法?

妖精的绣舞 提交于 2020-12-17 12:00:35
“ 语言只是工 具,而算法才是程序的灵魂 。”这句话,我估计你已经听到过无数次。 可一旦具体到日常工作中,我们还是会遇到各类的 「困扰」 : 像数据结构和算法这种脱离实际工作的知识,是不是除了面试,这辈子也用不着?那还有学的必要吗? 哪怕不懂算法,只要把 Java API、开发框架用得熟练,同样能让代码“飞”起来,为什么还要花精力去学? 先不急着解答你的问题,我先问你, 作为一名开发工程师,你真的愿意做一辈子的 「CRUD boy 」 ? 大部分程序员整天都在重复「增删改查」,哪怕是在所谓的“业务开发”中,也只不过是利用已经封装好的现成的接口、类库来堆砌或者翻译业务逻辑。 确实,这很少能用到数据结构或者算法之类的知识。 但是, 不需要自己实现,并不代表什么都不需要了解和掌握! 举个例子,假如你不懂这些类库背后的原理,不懂时间、空间复杂度分析,那又何谈能用好、用对?存储某个业务数据时,又怎么选择用 ArrayList,还是 LinkedList ?调用了某个函数后,又该如何去评估代码的性能和资源的消耗? 清醒一点, 初级程序员才比招式,高级程序员只看内功。 仅仅是一个简单的 ArrayList或Linked List 的选择,就可能带来成千上万倍的性能差别。 这时候,数据结构和算法的价值就完全凸显出来。只要你理解背后的数据结构,可以迅速看出这些类的本质区别。届时根本用不上死记硬背