1、常见的垃圾回收算法有几种类型?他们对应的优缺点是什么?
常见的垃圾回收算法可以分为以下几种类型:
标记-清除算法(Mark-Sweep):这是最基础的垃圾回收算法,分为两个阶段:标记阶段和清除阶段。
标记阶段的任务是标记出所有需要被回收的对象
清除阶段就是回收被标记的对象所占用的空间
优点是实现容易
缺点是可能会产生内存碎片,导致后续过程中需要为大对象分配空间时无法找到足够的空间而提前触发新的一次垃圾收集动作。
复制算法(Copying):将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。在清理时,将需要保留的对象复制到另一个区域上,直接紧凑排列,然后清空原来的一块区域。
优点是可以避免产生碎片
缺点是浪费了一半的空间
标记-整理算法(Mark-Compact):在标记-清除算法的基础上,清理完成后,将内存空间进行整理,使空间紧凑排列,解决了内存碎片的问题。缺点是开销较大。
分代算法(Generational):根据对象存活的时间将内存分为几代,一般分为新生代和老年代。新生代中的对象存活时间较短,采用复制算法;老年代中的对象存活时间较长,采用标记-整理或标记-清除算法。
优点是能够进行更精细化的垃圾回收
缺点是需要进行代之间的对象转移,开销较大。
2、CC 攻击是什么?什么叫 DDOS 攻击?什么是网站数据库注入?
CC 攻击(ChallengeCollapsar Attack)是 DDoS 攻击的一种类型,指的是针对 Web 服务器的攻击,攻击者通过向目标服务器发送大量请求,以达到耗尽服务器资源,导致服务器瘫痪的目的。CC 攻击主要是利用 HTTP 协议中的 GET、POST、HEAD 等请求方式进行攻击,通常配合着使用代理服务器和僵尸网络来增强攻击威力。
DDOS 攻击(Distributed Denial-of-Service Attack)指的是分布式拒绝服务攻击,即攻击者通过多个主机同时向目标服务器发送请求,使得服务器无法正常处理并响应这些请求,从而导致服务器性能下降,甚至瘫痪。DDOS 攻击通常利用网络中的感染计算机,组成大量的僵尸网络,由于攻击流量来自于大量的 IP 地址,很难被防御。
网站数据库注入(SQL Injection)是一种常见的 Web 应用程序漏洞攻击方式,在用户提交请求参数时,攻击者通过构造特定的 SQL 查询语句,向数据库发送恶意请求,从而获取或篡改数据库中的敏感数据。网站数据库注入攻击可以借助工具自动化扫描和攻击,因此危害较大,网站开发人员需要采取相应措施来避免漏洞和防范攻击。
以下是预防以上提到的攻击的一些常见措施:
CC 攻击预防:
使用防火墙或负载均衡器,限制相同IP或相同区域的连接请求数量;
配置流量限制或速率限制,限制每个连接的带宽或请求数;
设置CDN(内容分发网络)或WAF(Web应用防火墙),检测和拦截异常请求;
使用验证码或人机验证,识别并拦截自动化攻击。
DDoS 攻击预防:
使用网络监测系统或流量分析工具,及时发现和识别异常流量;
配置流量过滤器或封堵规则,过滤掉异常流量;
合理使用CDN、反向代理、负载均衡等技术,分散流量,避免单点故障;
预留足够的带宽和资源,增加系统的承受能力;
进行模拟测试,评估系统在各种攻击情况下的稳定性和可靠性。
网站数据库注入预防:
对所有输入数据进行过滤和验证,特别是对SQL语句进行检查和转义;
使用参数化查询或预处理语句,避免将用户输入的数据直接拼接到SQL语句中;
避免将敏感数据存储在数据库中,如密码等,可以使用加密方式存储;
定期更新数据库和系统的补丁和安全设置;
配置防火墙和访问控制策略,限制外部访问数据库和系统的权限。
3、你是否了解过新版本的 Java 特性?对 Java 未来的发展有什么看法?
Java 8:
Lambda表达式:它允许在代码中以更简洁、更直接的方式编写函数式接口的实现。
Stream API:提供了一种方便的方式来对集合进行处理和转换。它可以用于过滤、映射、排序、归约等操作。
默认方法:引入的默认方法允许接口定义方法的实现。这使得在修改接口时不必破坏现有的实现。
新的日期和时间API:用于替换旧的Date和Calendar类。它提供了更好的可读性、更严格的类型安全和更好的性能。
Nashorn JavaScript引擎:可以在Java中运行JavaScript代码。
Java 9:
模块化系统:使得开发者可以更容易地构建和维护大型应用程序。
JShell:它是一个交互式的Java REPL工具,允许开发者在没有编译的情况下快速测试和调试Java代码。
HTTP/2客户端:提供了对HTTP/2协议的支持,从而提高了网络性能。
改进的性能:包括改进的JIT编译器、改进的内存分配器和改进的垃圾收集器。
集合工厂方法:使得创建不可变集合更加容易和安全。
Java 10:
局部变量类型推断:允许开发者在声明变量时使用var关键字代替类型。
应用类数据共享:它可以通过共享类元数据来减少JVM启动时间和内存占用。
改进的性能:包括改进的G1垃圾收集器和更快的应用类数据共享。
Java 11:
HTTP客户端:引入新的HTTP客户端API,支持异步请求和响应、流式处理和 HTTP/2 协议。
改进的性能:Java 11中对性能进行了改进,包括改进的G1垃圾收集器、改进的字符串实现和改进的启动时间。
Epsilon垃圾收集器:引入新的实验性垃圾收集器,称为Epsilon,它是一种无操作的垃圾收集器,适用于测试和性能基准测试。
ZGC垃圾收集器:引入新的垃圾收集器,称为ZGC,它是一种可伸缩的低延迟垃圾收集器,适用于大型内存和低延迟应用程序。
Unicode 10:更新了Unicode版本,支持Unicode 10.0.0。
Java 12:
Switch表达式:引入新的Switch表达式,允许开发者在一个语句中定义多个分支。
改进的性能:Java 12中对性能进行了改进,包括改进的G1垃圾收集器、改进的启动时间和改进的字符串实现。
Shenandoah垃圾收集器:Java 12中引入了一种新的实验性垃圾收集器,称为Shenandoah,它是一种可伸缩的低延迟垃圾收集器,适用于大型内存和低延迟应用程序。
Java 13:
Text Blocks:Java 13中引入了一种新的文本块语法,使得在Java中编写多行字符串更加容易。
Switch表达式增强:Java 13中增强了Switch表达式,允许在一个分支中使用yield语句返回一个值。
改进的性能:Java 13中对性能进行了改进,包括改进的G1垃圾收集器、改进的字符串实现和改进的代码生成器。
Java 14:
Records:引入新的记录类语法,使得在Java中编写数据类更加简单。
Switch表达式增强:允许在一个分支中使用箭头语法返回一个值。
改进的性能:Java 14中对性能进行了改进,包括改进的G1垃圾收集器、改进的字符串实现和改进的代码生成器。
Java 15:
Sealed Classes:可以限制类的继承关系。
Text Blocks增强:使得在多行字符串中包含表达式更加容易。
改进的性能:包括改进的G1垃圾收集器、改进的字符串实现和改进的代码生成器。
Java 16:
Records增强:使得可以添加非规范化的成员变量和方法。
Pattern Matching for instanceof:引入新的模式匹配语法,使得在使用instanceof关键字时更加简单和方便。
Vector API:J引入新的向量API,使得在处理向量数据时更加容易。
Java 17:
Sealed Classes增强:增强Sealed类语法,使得可以将密封类作为父类或者接口。
Pattern Matching for switch:增强Pattern Matching语法,使得可以在switch表达式中使用。
其他改进:改进的G1垃圾收集器、改进的JVM启动时间等。
发展趋势:
云计算和大数据:随着云计算和大数据技术的迅猛发展,Java在这些领域将继续扮演重要的角色。Java在分布式计算和并行编程方面拥有丰富的经验和工具,能够帮助开发人员更好地利用云计算和大数据技术,实现高效的数据处理和分析。
人工智能和机器学习:人工智能和机器学习是目前最热门的技术领域之一,Java在这些领域也有不少的应用。未来,随着机器学习和深度学习技术的普及,Java将继续为开发人员提供各种工具和框架,帮助他们构建高效和可扩展的机器学习应用。
物联网:随着物联网技术的发展,Java在这个领域也有很大的潜力。Java具有跨平台性和高度可移植性,这些特性对于构建物联网应用至关重要。未来,Java将继续提供各种工具和框架,帮助开发人员构建更加智能和高效的物联网应用。
性能优化:Java一直以来都是一门高性能的编程语言,未来Java将继续致力于性能优化。这包括优化Java虚拟机、垃圾回收器和其他核心组件,以及提供更好的工具和框架,帮助开发人员更好地优化他们的Java应用程序。
安全性:随着网络攻击和数据泄露事件的不断增多,安全性已经成为了Java开发人员最关注的问题之一。未来,Java将继续提供各种安全性功能和工具,帮助开发人员构建更加安全和可靠的Java应用程序。