jdk1.8新特性、jvm内存结构、垃圾回收

一、JDK 1.8 也被称为 Java 8,有许多重要的新特性:

1、Lambda 表达式:

它允许把函数作为一个方法的参数(函数作为值传递),可以用更紧凑的方式来表示匿名内部类了例如:

new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello from a thread!");
    }
}).start();

使用 Lambda 表达式后,可以简化为:

new Thread(() -> System.out.println("Hello from a thread!")).start();

优点:Lambda 表达式使代码更加简洁、易读,在处理集合操作如(forEach、mapfilter等方法)时非常方便。它大大减少了匿名内部类带来的代码冗余,让程序员能够更专注于业务逻辑的实现。

2、Stream流:

提供了一种对集合进行操作的新方式,支持对集合中的元素进行过滤、映射、排序、汇总等操作,采用链式编程,进行多个中间操作,例如filtermapsorted等操作都是中间操作。

优点:让代码更简洁高效,将复杂的集合操作通过链式调用的方式表达出来,减少了循环和条件判断的嵌套。在处理大量数据集合时,它可以显著提高代码的性能和可读性,使得数据处理操作更加直观。

3、接口的默认方法和静态方法 :

在 JDK 1.8 之前,接口中只能有抽象方法。这意味着如果一个接口需要添加新的方法,所有实现该接口的类都必须实现这个新方法。JDK 1.8 引入了默认方法和静态方法,默认方法允许在接口中提供方法的默认实现,实现类可以选择重写或者直接继承这个默认实现;静态方法则是直接属于接口,可以通过接口名直接调用。

优点:增强了接口的扩展性,在不破坏现有实现类的情况下,可以向接口添加新的方法。

3、新的日期和时间API :

解决了旧版 Date 类的设计缺陷。

4.optional类

Optional是 Java 8 中引入的一个容器类,用于解决空指针异常(NullPointerException)的问题。在 Java 程序中,空指针异常是一个非常常见的错误,当尝试访问一个为null的对象的方法或属性时就会发生。Optional类的设计目的是提供一种更安全的方式来处理可能为null的值。

可以把Optional想象成一个盒子,这个盒子里面要么装着一个实际的值(非null),要么就是空的(表示没有值)

二、jvm内存结构:

1.程序计数器:

是一块较小的内存空间,生命周期与线程相同。

每个线程都有自己的程序计数器,用于记录当前线程所执行的字节码指令的位置。如果线程正在执行的是一个Java方法,程序计数器会保存指向该方法字节码的下一条指令的地址;如果是本地方法,则程序计数器值为undefined

2.java虚拟机栈:

它以帧的形式存储方法调用的状态,每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

一个栈帧主要包括局部变量表、操作数栈、动态连接、方法返回地址等部分

局部变量表:用于存放方法参数和方法内部定义的局部变量。

操作数栈:主要用于在方法执行过程中进行算术运算和方法调用等操作。

3.本地方法栈:

本地方法栈与 Java 虚拟机栈类似,它们的区别在于虚拟机栈为 Java 方法服务,而本地方法栈是为本地方法(Native Method)服务的。本地方法是指用非 Java 语言(如 C 或 C++)编写的方法

4.堆空间:

所有线程共享的一块内存区域,用于存放对象实例和数组。几乎所有的对象实例都在这里分配内存。

是垃圾收集管理的主要区域。因为对象在使用过程中会不断地被创建和销毁,垃圾收集器会负责回收那些不再被使用的对象所占用的内存,以避免内存泄漏。

5.方法区:

 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。

6.运行时常量池:

方法区的一部分,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池存放。

具有动态性,运行期间也可能将新的常量放入池中,例如String类的intern()方法。

三、垃圾回收:

1.如何判断对象是否为垃圾

可达性分析法:

通过一系列被称为 “GC Roots” 的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链。当一个对象到 GC Roots 没有任何引用链相连(即不可达)时,则证明这个对象是可以被回收的。

2.垃圾回收算法:

2.1.标记-清除算法:

标记阶段:首先,垃圾回收器会从 GC Roots 开始,对所有可达的对象进行标记。这个过程会遍历对象图,标记出所有存活的对象。

清除阶段:在标记完成后,回收器会清理掉那些没有被标记的对象,即将它们所占用的内存空间回收。

缺点:这种算法会产生内存碎片。因为清除后的内存空间是不连续的,当需要分配一个较大的对象时,可能没有足够大的连续空间,尽管总的空闲内存可能是足够的。

2.2.复制:

原理:它将内存划分为大小相等的两块,每次只使用其中一块。当进行垃圾回收时,会将存活的对象复制到另一块内存区域中,然后把原来使用的那块内存全部清除。

优点:这种算法不会产生内存碎片,因为每次回收后,内存都是连续的。而且复制操作相对简单,效率较高。

缺点:它的缺点是浪费了一半的内存空间。而且如果对象存活率较高,复制的成本也会比较高。这种算法通常用于新生代的垃圾回收,因为新生代中的对象大部分是朝生暮死的,存活率较低。

2.3.标记-整理算法:

标记阶段:和标记 - 清除算法类似,先标记出所有存活的对象。

整理阶段:在标记完成后,不是直接清除不可达对象,而是将所有存活的对象向一端移动,然后清理掉边界以外的内存空间。

优点:解决了标记 - 清除算法产生内存碎片的问题,同时不需要像复制算法那样浪费一半的内存空间。这种算法适用于老年代的垃圾回收,因为老年代中的对象存活率较高。

3。分代收集设计:

根据对象的存活周期将内存划分为不同代,一般分为新生代和老年代,还有的会细分出永久代(在 Java 8 之后被元数据区替代)或元数据区。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/941126.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据分析和AI丨知识图谱,AI革命中数据集成和模型构建的关键推动者

人工智能(AI)已经吸引了数据科学家、技术领导者以及任何使用数据进行商业决策者的兴趣。绝大多数企业都希望利用人工智能技术来增强洞察力和生产力,而对于这些企业而言,数据集的质量差成为了最主要的障碍。 数据源需要进行清洗且明…

java小知识点:比较器

java中自主排序主要根据一个Comparator类来实现。 他内部实现用的是Timsort策略。大概思想是说将整个集合分成几个小段,每个小段分别排序,然后再拼在一起。 主要用法是传入两个数(也可以不是Integer或int类型,这里只是把他们都统称…

【嵌入式开发笔记】OpenOCD到嵌入式调试

最近在把玩一块Risc-V的开发板,使用开发板调试时,需要用到专门的下载器和OpenOCD进行调试。 为了连接这个板子,费了九牛二虎之力。 这里简单记录一下自己的折腾经过吧。 0x00 环境准备 0x0001 调试背景 系统:Virtual Box Ub…

安装MongoDB,环境配置

官网下载地址:MongoDB Shell Download | MongoDB 选择版本 安装 下载完成双击打开 点击mongodb-windows-x86_64-8.0.0-signed 选择安装地址 检查安装地址 安装成功 二.配置MongoDB数据库环境 1.找到安装好MongoDB的bin路径 复制bin路径 打开此电脑 -> 打开高级…

15.初识接口1 C#

这是一个用于实验接口的代码 适合初认识接口的人 【CSDN开头介绍】(文心一言AI生成) 在C#编程世界中,接口(Interface)扮演着至关重要的角色,它定义了一组方法,但不提供这些方法的实现。它要求所…

2.学习TypeScript 编译选项配置

自动编译 我们可以使用 tsc ...../.ts -w 命令进行ts文件的自动编译 执行后 编译会持续侦听 自动编译 这种方式只能侦听一个文件 对做项目肯定是不现实的,为了解决这个问题,我们需要添加一个tsconfig.json文件,写入一个基础对象 再有tsconfi…

Python爬虫(5) --爬取网页视频

文章目录 爬虫爬取视频指定url发送请求UA伪装请求页面 获取想要的数据解析定位定位音视频位置 存放视频完整代码实现总结 爬虫 Python 爬虫是一种自动化工具,用于从互联网上抓取网页数据并提取有用的信息。Python 因其简洁的语法和丰富的库支持(如 requ…

VS Code Copilot 与 Cursor 对比

选手简介 VS Code Copilot:算是“老牌”编程助手了,虽然Copilot在别的编辑器上也有扩展,不过体验最好的还是VS Code,毕竟都是微软家的所以功能集成更好一些;主要提供的是Complete和Chat能力,也就是代码补全…

基础元器件的学习

1、二极管 1.1二极管的符号 ZD是稳压二极管 VD、V、D是普通二极管的符号。 1.2二极管的反向恢复时间 首先交流电为上正下负,然后下正上负。当二极管接到反向电压,二极管存在寄生电容,电压不能立刻突变,当输入频率变高时&#…

unipp中使用阿里图标,以及闭坑指南

-----------------------------------------------------点赞收藏才是更新的动力------------------------------------------------- unipp中使用阿里图标 官网下载图标在项目中引入使用注意事项 官网下载图标 进入阿里图标网站 将需要下载的图标添加到购物车中 2. 直接下载…

QtCreator配置github copilot实现AI辅助编程

文章目录 1、概述2、配置环境3、演示 1、概述 新时代的浪潮早就已经来临,上不了船的人终将被抛弃,合理使用AI辅助开发、提升效率是大趋势,注意也不要过于依赖。 2024年12月18日,GitHub 官方宣布了一个激动人心的重大消息&#xf…

web实操8-cookie

会话技术 会话: 一次会话中包含多次请求和响应。 客户端浏览器访问服务器的资源,只要客户端或者服务器端不关闭,这始终在一次会话范围内,这一次会话范围内可以包含多次请求并且收到多次相应。 一次会话:浏览器第一…

深度学习之超分辨率算法——SRCNN

网络为基础卷积层 tensorflow 1.14 scipy 1.2.1 numpy 1.16 大概意思就是针对数据,我们先把图片按缩小因子照整数倍进行缩减为小图片,再针对小图片进行插值算法,获得还原后的低分辨率的图片作为标签。 main.py 配置文件 from model im…

Javaweb 在线考试系统

🥂(❁◡❁)您的点赞👍➕评论📝➕收藏⭐是作者创作的最大动力🤞 💖📕🎉🔥 支持我:点赞👍收藏⭐️留言📝欢迎留言讨论 🔥🔥&…

Qt for Python (PySide6)设置程序图标和任务栏图标

环境 使用Qt for Python开发Windows应用程序。 Python版本:3.12 Qt版本:PySide6 前言 先上一个简单的测试程序 from PySide6.QtWidgets import QMainWindow,QLabel,QApplication from PySide6 import QtGui import sysclass MainWindow(QMainWindow)…

【C#】实现Json转Lua (Json2Lua)

关键词: C#、JsonToLua、Json2Lua、对象序列化Lua 前提需引入NewtonsofJson,引入方法可先在Visual Studio 2019 将Newtonsoft.Json.dll文件导入Unity的Plugins下。 Json格式字符串转Lua格式字符串,效果如下: json字符串 {"1": &q…

Windows平台C++部署 vcpkg 安装protobuf + gRPC实现图像传输

vcpkg 安装 https://github.com/microsoft/vcpkg.git.\bootstrap-vcpkg.bat vcpkg --version参考:Windows安装vcpkg教程(VS2022) protocbuf 安装与编译 vcpkg install grpc:x64-windowsprotocbuf 安装与编译 vcpkg install protobuf proto…

ScottPlot学习的常用笔记-02

ScottPlot学习的常用笔记-02 写在前面Why&Target:这里记一些杂项。上下文&背景 先记一下这几个小时的新收获先说一下,为什么可开发可视工具缩放的问题ScottPlot5.0起步.net Core: WinExe.Net Framework也是可以的 写在前面 Why&Target&…

CTF_1

CTF_Show 萌新赛 1.签到题 <?php if(isset($_GET[url])){system("curl https://".$_GET[url].".ctf.show"); }else{show_source(__FILE__); }?> 和 AI 一起分析 1.if(isset($_GET[url]))检查GET请求中是否存在名为url的参数。 curl 2.curl…

【Spring】Spring框架之-AOP

目录 1. AOP的引入 2. AOP相关的概念 2.1 AOP概述 2.2 AOP的优势 2.3. AOP的底层原理--目前先不具体阐述&#xff0c;后面讲 3. Spring的AOP技术-配置文件方式 3.1 AOP相关的术语 3.2 基本准备工作 3.3 AOP配置文件方式的入门 3.4 切入点的表达式 3.5 AOP的通知类型 …