JDK

《深入理解Java虚拟机:JVM高级特性与最佳实践》读书笔记

二次信任 提交于 2020-10-07 09:52:34
目录 第一部分 走进Java 一、走进Java 第二部分 自动内存管理机制 二、内存区域和内存溢出异常 1、运行时数据区 2、HotSpot虚拟机对象探秘 3、OutOfMemoryError异常 三、垃圾收集器和内存分配策略 1、对象已死吗?如何确定对象是否还“活着” 2、垃圾回收算法 3、HotSpot算法实现 4、垃圾收集器 5、内存分配和回收策略 四、虚拟机性能监控与故障处理工具 1、jps 2、jstat。监视JVM内存工具。 3、jinfo。查看和修改JVM运行参数 4、jmap。命令用于生成heap dump文件 5、jstack。Java堆栈跟踪工具 五、常见JVM配置说明 1、JVM配置 1.3、参数说明 G1最佳实践 1、不断调优暂停时间指标 2、不要设置新生代和老年代的大小 3、关注Evacuation Failure 1、Minor GC、Major GC和Full GC之间的区别 2、常用命令 3、问题排查 七、虚拟机类加载机制 1、虚拟机把表示类的class文件加载到内存,经过校验、转换解析、初始化,最终形成可以被虚拟机直接使用的java类型,这就是虚拟机的类加载机制 2、类加载的时机 3、类加载的过程 4、类加载器 第五部分 高效并发 十二、Java内存模型与线程 1、硬件的效率与一致性 2、Java内存模型 3、Java与线程 十三、线程安全与锁优化

Java面试题总结答案(乱序版,2020-08-17)

耗尽温柔 提交于 2020-10-07 07:56:22
目录 一、JDK 和 JRE 有什么区别? 二、== 和 equals 的区别是什么? 三、hashcode是什么?有什么作用? 四、Java 容器都有哪些? 五、Collection 和 Collections 有什么区别? 六、List、Set、Map 之间的区别是什么? 七、Synchronized 用过吗,其原理是什么? 八、jsp 和 servlet 有什么区别? 九、请列举出在 JDK 中几个常用的设计模式? 十、什么是 Spring 框架?Spring 框架有哪些主要模块? 十一、使用 Spring 框架能带来哪些好处? 十二、什么是 Spring Boot?Spring Boot 有哪些优点? 十三、为什么要使用 hibernate? 十四、mybatis 中 #{}和 ${}的区别是什么? 十五、RabbitMQ的使用场景有哪些? 十六、数据库的三范式是什么? 十七、Redis是什么?都有哪些使用场景? 十八、说一下 jvm 的主要组成部分?及其作用? 十九、说一下 jvm 运行时数据区? 一、JDK 和 JRE 有什么区别? JDK(Java Development Kit),Java开发工具包 JRE(Java Runtime Environment),Java运行环境 JDK中包含JRE,JDK中有一个名为jre的目录,里面包含两个文件夹bin和lib

HashMap源码中的位运算符&

我怕爱的太早我们不能终老 提交于 2020-10-07 07:26:31
引言 最近在读HashMap源码的时候,发现在很多运算符替代常规运算符的现象。比如说用 hash & (table.length-1) 来替代取模运算 hash&(table.length) ;用 if((e.hash & oldCap) == 0) 判断扩容后元素的位置等等。 1.取模运算符%底层原理 ​ 总所周知,位运算&直接对二进制进行运算;而对于取模运算符%:a % b 相当于 a - a / b * b,底层实际上是除法器,究其根源也是由底层的减法和加法共同完成。所以其运行效率要远远小于位运算符&。 2.位运算符&如何实现取模功能 ​ 我们先来看两个例子 5 & 7 9 & 7 0101----5 1001----9 & & 0111----7 0111----7 = = 0101----5 0001----1 ​ 确实, hash & (table.length-1) 来实现了运算 hash&(table.length) 从二进制的角度来说,5%8实际上是将二进制5(0101)向右移动3位,而与7(0111)进行与运算实际上就是将位数向右移动三位。不过要注意的是,只有当length的长度为2^n时,结论才成立。 3.位运算符&在 if((e.hash & oldCap) == 0) 判断扩容后元素的位置 ​ 这是出自于JDK1.8中扩容函数resize()的一行代码

聊聊Java中的异常及处理

心已入冬 提交于 2020-10-07 07:13:14
前言 在编程中异常报错是不可避免的。特别是在学习某个语言初期,看到异常报错就抓耳挠腮,常常开玩笑说编程1分钟,改bug1小时。今天就让我们来看看什么是异常和怎么合理的处理异常吧! 异常与error介绍 下面还是先让我们来看一下基本概念吧! ​ 异常 指程序运行过程中出现的非正常现象,例如用户输入错误、除数为零、需要处理的文件不存在、数组下标越界等。异常机制本质就是当程序出现错误,程序安全退出的机制。在Java的异常处理机制中,引进了很多用来描述和处理异常的类,称为异常类。异常类定义中包含了该类异常的信息和对异常进行处理的方法。 ​ Java是采用面向对象的方式来处理异常的。处理过程: 抛出异常:在执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给JRE。 捕获异常:JRE得到该异常后,寻找相应的代码来处理该异常。JRE在方法的调用栈中查找,从生成异常的方法开始回溯,直到找到相应的异常处理代码为止。 让我们来看看前面所讲到的异常类究竟是个什么东西! 其实所有的异常对象都是派生于Throwable类的一个实例。如果内置的异常类不能够满足需要,还可以创建自己的异常类。所有异常的根类为java.lang.Throwable。看看它的家族长什么样。 Throwable类下面主要是两大门派。 Error 和 Exception 。 Error

Linux环境下部署java项目上线

杀马特。学长 韩版系。学妹 提交于 2020-10-07 06:24:15
项目环境 jdk1.8 docker容器 ntp服务器 nginx服务器 postgresql数据库 redis缓存 profile项目运行指令配置 jdk文件夹下镜像和脚本-setup.sh #!/bin/bash echo '检查java运行环境' if grep -q "JAVA_HOME" /etc/profile ;then echo "系统已配置java环境变量" jv=`$JAVA_HOME/bin/java -version 2>&1` if echo "$jv" | grep -q "1.8" then echo "版本匹配,跳过安装" exit 0 else echo "但与安装包中的环境不一致,跳过安装,请检查/ect/profile文件!" exit 0 fi fi echo "未配置JAVA运行环境,开始安装" echo "卸载系统自带的JAVA环境" NAMES=`rpm -qa|grep jdk| grep -E '1.4|1.5|1.6|1.7|1.8' | awk '{print $1}' `; for proc in $NAMES do rpm -e --nodeps $proc done echo "释放JDK" tar zxf jdk-8uz31-linux-x64.tar.gz if[!-d /usr/java/jdk1.6]; then

架构师之路(十一)之探讨一台机器中JVM能创建的线程上限到底是多大?

随声附和 提交于 2020-10-07 05:04:50
引言 这两天在用多线程ThreadPoolExecutor解决问题的时候,突发奇想的了解一下jvm到底最多能创建多少线程,因为在遇到高并发业务场景的时候,必须使用多线程来应付问题,正所谓兵来将挡,水来土掩,业务请求来自然就是线程干活了.了解一下影响jvm创建线程的因素对后续jvm调优,高并发问题的解决多多少会有点帮助吧,,哪怕一点. JVM 体系结构 要想了解jvm对线程的影响,首先得简单了解一下jvm的体系结构,这里直接上图: jvm的基本结构图 上图是从网上直接扒下来的,其实都差不多,简单介绍一下; (1) 程序计数器:   这玩意又叫PC寄存器, 程序计数器是线程私有的内存,JVM多线程是通过线程轮流切换并分配处理器执行时间的方式实现的,当线程切换后需要恢复到正确的执行位置(处理器)时,就是通过程序计数器来实现的。此内存区域是唯一 一个在JVM规范中没有规定任何OutOfMemoryError情况的区域。 (2) Java虚拟机栈:   Java虚拟机栈也是线程私有的,它的生命周期与线程相同,Java虚拟机栈为JVM执行的Java方法(字节码)服务。每个Java方法在执行时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链表、方法出口等信息。   局部变量表 存放的是基本数据类型,对象引用和returnAddress类型。也就是说 基本数据类型 直接在栈中分配空间;

JAVA服务实例内存高问题排查及解决

我怕爱的太早我们不能终老 提交于 2020-10-07 03:23:10
生产服务内存高问题 问题描述 1、“计算中心” 服务在生产环境运行一段时间后,实际占用内存4.8G,业务运行正常,未出现OOM。(本文以此服务进行排查) 2、生产环境的老项目,均出现运行一段时间后,内存被占满但未OOM的情况。部分实例因内存占用过高导致被系统kill,一般需要通过增加机器、实例进行解决(资源浪费)。 造成的影响 1、服务器物理内存15g,部署了三个服务。如实际占用内存都超过4.8g,导致服务器物理内存不够用,出现告警而将占用内存最大进程kill掉,影响生产服务的可用性,后果十分严重。 2、如服务申请的内存超出了JVM能提供的内存大小(内存泄漏),将会导致java堆内存溢出,从而发生full gc,导致服务响应大幅度变慢,卡机等状态。 3、在公司大促等场景的情况下,内存占用很高的服务会带来很大风险,通常需提前联系运维同事对“计算中心”进行重启,增加了开发及运维同事维护的工作量。 排查过程 代码 (1)根据cat监控,获取“计算中心”中的热点方法,进行REVIEW,修正了部分可能会导致内存泄露的方法。并进行了观察。 (2)通过VisualVM监控,定位到部分耗时较久的操作DB热点方法,通过增加索引等方式,把查询性能控制在毫秒级。 (3)dump“计算中心”的内存镜像,通过MAT等工具观察各个对象在堆空间中所占用的内存大小、类实例数量、对象引用关系。 结论:通过以上三点

处理“ java.lang.OutOfMemoryError:PermGen空间”错误

落爺英雄遲暮 提交于 2020-10-07 00:50:12
问题: Recently I ran into this error in my web application: 最近,我在Web应用程序中遇到此错误: java.lang.OutOfMemoryError: PermGen space java.lang.OutOfMemoryError:PermGen空间 It's a typical Hibernate/JPA + IceFaces/JSF application running on Tomcat 6 and JDK 1.6. 这是在Tomcat 6和JDK 1.6上运行的典型Hibernate / JPA + IceFaces / JSF应用程序。 Apparently this can occur after redeploying an application a few times. 显然,这可能是在重新部署应用程序几次之后发生的。 What causes it and what can be done to avoid it? 是什么原因引起的,可以采取什么措施避免它发生? How do I fix the problem? 我该如何解决该问题? 解决方案: 参考一: https://stackoom.com/question/Mx9/处理-java-lang-OutOfMemoryError-PermGen空间

Java日期时间API系列34-----Jdk8中java.time包中的新的日期时间API类应用,使用Period一行代码计算生日。

夙愿已清 提交于 2020-10-06 12:09:08
  通过J ava日期时间API系列9-----Jdk8中java.time包中的新的日期时间API类的Period和Duration的区别 中得知,Period可以比较2个日期相差的年月日。年龄计算是2个日期相差的年的值,具体还要根据月日微调,如果小于生日年龄减1。下面使用Period可以非常方便的计算年龄。 1.使用Period一行代码计算生日 核心代码就是一行代码: Period.between(birthDay, LocalDate.now()).getYears(); /** * 计算年龄 * @param birthDay * @return int 年龄 */ public static int getAge(LocalDate birthDay){ Objects.requireNonNull(birthDay, "birthDay" ); Period period = Period.between(birthDay, LocalDate.now()); if (period.getYears() < 0 ) { throw new DateTimeException("birthDay is before now!" ); } else { return period.getYears(); } } /** * 计算年龄 * @param birthDay *

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

风流意气都作罢 提交于 2020-10-06 09:28:22
之前民工哥也给大家介绍过一款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中进行手动编写。 部署此项目后, 配置nginx再也不用上网各种搜索,