多线程和JVM

一,多线程实现的四种方式

1. 实现Runnable接口

普通实现: 

public class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("线程执行中...");}
}public class Main {public static void main(String[] args) {Thread thread = new Thread(new MyRunnable());thread.start();}
}

 Lambda表达式:

public class Main {public static void main(String[] args) {Thread thread = new Thread(() -> System.out.println("线程执行中..."));thread.start();}
}

2. 实现Callable接口

普通实现方式:

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;public class MyCallable implements Callable<String> {@Overridepublic String call() throws Exception {return "线程执行中...";}
}public class Main {public static void main(String[] args) {Callable<String> callable = new MyCallable();FutureTask<String> futureTask = new FutureTask<>(callable);Thread thread = new Thread(futureTask);thread.start();try {String result = futureTask.get();System.out.println(result);} catch (InterruptedException | ExecutionException e) {e.printStackTrace();}}
}

Lambda实现:

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;public class Main {public static void main(String[] args) {Callable<String> callable = () -> "线程执行中...";FutureTask<String> futureTask = new FutureTask<>(callable);Thread thread = new Thread(futureTask);thread.start();try {String result = futureTask.get();System.out.println(result);} catch (InterruptedException | ExecutionException e) {e.printStackTrace();}}
}

3. 继承Thread类

public class MyThread extends Thread {@Overridepublic void run() {System.out.println("线程执行中...");}
}public class Main {public static void main(String[] args) {Thread thread = new MyThread();thread.start();}
}

4. 使用Executors工具类创建线程池

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("线程执行中...");}
}public class Main {public static void main(String[] args) {ExecutorService executorService = Executors.newFixedThreadPool(5);executorService.execute(new MyRunnable());executorService.shutdown();}
}

二,JVM两种垃圾回收方式

Java 堆是垃圾收集器管理的主要区域,因此也被称作 GC 堆(Garbage Collected Heap)。从垃圾回收的角度,由于现在收集器基本都采用分代垃圾收集算法,所以 Java 堆还可以细分为:新生代和老年代;再细致一点有:Eden、Survivor、Old 等空间。进一步划分的目的是更好地回收内存,或者更快地分配内存。


著作权归Guide所有 原文链接:https://javaguide.cn/java/jvm/memory-area.html#%E5%A0%86

Minor GC(年轻代GC)和Full GC(老年代GC)是Java虚拟机中的垃圾收集器执行的两种不同类型的垃圾回收操作。

1. Minor GC(年轻代GC):

它是指对年轻代(包括Eden区和Survivor区)进行垃圾回收的过程。在Minor GC中,只有年轻代区域会被扫描和回收,而老年代不会受到影响。Minor GC通常会伴随着短暂的停顿时间(性能影响小),用于回收年轻代的垃圾对象。Minor GC的频率比较高,一般在新生代空间不足时触发。

2. Full GC(老年代GC):

它是指对整个堆内存(包括年轻代和老年代)进行垃圾回收的过程。在Full GC中,会同时对年轻代和老年代进行扫描和回收。Full GC通常会伴随着较长的停顿时间(性能影响大),因为需要扫描整个堆内存。Full GC的频率相对较低,一般在老年代空间不足、永久代空间不足、系统空闲时或者调用`System.gc()`方法时触发。

使用场景:

  1. - Minor GC:适用于应用程序中大量创建和销毁对象的情况,例如短期的请求处理、临时对象的创建等。Minor GC的目标是尽快回收年轻代的垃圾对象,以保证年轻代的可用空间
  2. - Full GC:适用于应用程序中长时间运行的对象、大对象、永久代的垃圾回收等。Full GC的目标是回收整个堆内存的垃圾对象,以释放更多的可用空间

需要注意的是,Full GC的执行会导致较长的停顿时间,可能会对应用程序的性能产生较大的影响,因此在设计和调优应用程序时需要避免Full GC的频繁触发。

三,垃圾收集算法

1,标记-清除算法

适用场景:都行

特点:

  1. 效率问题:标记和清除两个过程效率都不高。
  2. 空间问题:标记清除后会产生大量不连续的内存碎片。

2,复制算法

使用场景:新生代内存区收集车(存活对象数量少)

特点:

  • 可用内存变小:可用内存缩小为原来的一半。
  • 不适合老年代:如果存活对象数量比较大,复制性能会变得很差。 

3,标记-整理算法

适用场景:老年代内存区(存活对象数量多)

特点:由于多了整理这一步,因此效率也不高,适合老年代这种垃圾回收频率不是很高的场景

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vmware workstation的三种网络模式通俗理解

一、前言 workstations想必很多童鞋都在用&#xff0c;经常会用来在本机创建不同的虚拟机来做各种测试&#xff0c;那么对于它支持的网络模式&#xff0c;在不同的测试场景下应该用哪种网络模式&#xff0c;你需要做下了解&#xff0c;以便可以愉快的继续测&#xff08;搬&…

全年重磅!《2023年度TikTok电商行业趋势白皮书》发布!

2023年&#xff0c;似乎所有的东西都往相反的方向发展。疫情消退后经济没有明朗&#xff0c;局部冲突愈演愈烈没有消停&#xff0c;打工人辛苦工作工资没有涨&#xff0c;疯狂买买买的双十一也开始变得冷清... 似乎是不友好的一年&#xff0c;那你有听到“增长的声音”吗&…

uniCloud 云函数

相对于云函数&#xff0c;官方更推荐使用 云对象 新建云函数 编辑云函数 uniCloud-aliyun/cloudfunctions/hello_func/index.js use strict; exports.main async (event, context) > {let {name} eventreturn 你好&#xff0c;${name}! };云函数接收的参数从event中解构获…

ARM+FPGA多通道信号采集与处理模块开发方案

多通道信号采集与处理模块开发方案 开发一套多通道光电信号采集与处理模块&#xff0c;实现对64通道传感信号采集、处理与存储功能。主要包括数据采集与处理电路&#xff0c;系统控制软件&#xff0c;信号处理算法实现及数据存储。其中包括8通道ADC&#xff0c;每一路ADC采样数…

CTFHub | 存储型

0x00 前言 CTFHub 专注网络安全、信息安全、白帽子技术的在线学习&#xff0c;实训平台。提供优质的赛事及学习服务&#xff0c;拥有完善的题目环境及配套 writeup &#xff0c;降低 CTF 学习入门门槛&#xff0c;快速帮助选手成长&#xff0c;跟随主流比赛潮流。 0x01 题目描述…

js逆向第9例:猿人学第2题-js混淆-动态cookie1

题目2:提取全部5页发布日热度的值,计算所有值的加和,并提交答案 (感谢蔡老板为本题提供混淆方案) 既然题目已经给出了cookie问题,那就从cookie入手,控制台找到数据请求地址 可以看到如下加密字符串m类似md5,后面跟着时间戳 m=45cc41dcdb15159ebb50564635f8e362|1704301…

智能视频监控技术在旅游业中如何发挥最大作用,助力旅游业发展

随着“南方小土豆勇闯哈尔滨”的词条霸榜热搜&#xff0c;大众旅游热情再次点燃。最近哈尔滨游客爆满的情况&#xff0c;极易发生游客迷路、景区瘫痪、交通堵塞等情况&#xff0c;当地有关部门的压力不言而喻。对于节假日或者“破天富贵”、“报复性旅游”的情况&#xff0c;景…

webrtc报文记录

tcp.port 10443 || tcp.port 6080 || udp.port 8000 https://download.csdn.net/download/dualvencsdn/88706745

如何使用ArcGIS Pro转换单个点坐标

坐标转换作为基础的功能&#xff0c;一般的GIS软件都支持&#xff0c;大多数情况下&#xff0c;我们是转换整个图层&#xff0c;如果想要转换单个坐标点&#xff0c;在ArcGIS Pro内也是支持的&#xff0c;这里为大家介绍一下转换方法&#xff0c;希望能对你有所帮助。 拾取坐标…

IPv6路由协议---IPv6静态路由

IPv6路由协议 路由是数据通信网络中最基本的要素。路由信息就是知道报文发送的路径信息,路由的过程就是报文转发的过程。 根据路由目的地的不同,路由可划分: 1.网段路由:目的地为网段,IPv4地址子网掩码长度小于32位或IPv6地址前缀长度小于128位。 2.主机路由:目的地为主…

Python爬虫实战技巧:如何在爬取过程中动态切换代理IP

目录 前言 第一步&#xff1a;获取代理IP列表 第二步&#xff1a;测试代理IP的可用性 第三步&#xff1a;动态切换代理IP 总结 前言 在进行爬虫开发的过程中&#xff0c;有时候需要使用代理IP来访问目标网站&#xff0c;以避免被封IP或者降低访问频率的限制。本文将介绍如…

Zabbix自定义监控内容实验(带自动报警)

实验前准备 zabbix服务端&#xff1a;192.168.188.17 zabbix客户端&#xff1a;192.168.188.11 部署zabbix服务端&#xff08;192.168.188.17&#xff09; zabbix-server 内存至少2G&#xff0c;推荐4G (1) 关闭防火墙 systemctl stop firewalld setenforce 0 (2)获取zabbix下…

第五周:深度学习知识点回顾

前言&#xff1a; 讲真&#xff0c;复习这块我是比较头大的&#xff0c;之前的线代、高数、概率论、西瓜书、樱花书、NG的系列课程、李宏毅李沐等等等等…那可是花了三年学习佳实践下来的&#xff0c;现在一想脑子里就剩下几个名词就觉得废柴一个了&#xff0c;朋友们有没有同感…

web学习笔记(九)

目录 1.初识JS(JavaScript) 1.1什么是JavaScript&#xff1f; 1.2HTML5 CSS3 javaScript三者的关系 1.3 JAVAScript的作用 1.4JAVAScript的组成部分 1.5JS注释 1.6补充知识 2.JS的引入方法 2.1行内式 2.2嵌入式&#xff08;内嵌式&#xff09; 2.3外链式 3.输入和…

Linux--系统安全及应用

1.1账号安全控制 用户账号是计算机使用者的身份凭证或标识&#xff0c;每个要访问系统资源的人&#xff0c;必须凭借其用户账号才能进入计算机。在Linux系统中&#xff0c;提供了多种机制来确保用户账号的正当、安全使用。 1.系统账号清理 在Linux系统中&#xff0c;除了用户手…

ChatGPT绘制全球植被类型分布图、生物量图、土壤概念图、处理遥感数据并绘图、病毒、植物、动物细胞结构图

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

2024年华为hcie方向有哪些?hcie 考点在哪里?

华为作为全球领先的ICT解决方案供应商&#xff0c;其认证体系在业内具有极高的权威性和认可度。其中&#xff0c;华为认证体系中的最高级别认证——HCIE&#xff0c;已经成为无数技术爱好者追求的目标。下面将探讨华为HCIE的方向及其考点&#xff0c;希望能对那些有志于获取HCI…

redis安装与配置

目录 1. 切换到 root 用户 2. 搜索安装包 3. 安装 redis 4. 查看 redis 是否正常存在 5. 修改ip 6. 重新启动服务器 7. 连接服务器 1. 切换到 root 用户 通过 su 命令切换到 root 用户。 2. 搜索安装包 apt search redis 这里安装的是下面的版本&#xff1a; 3. 安装 …

【MIT 6.S081】2020, 实验记录(1),Lab: Xv6 and Unix utilities

目录 实验准备TasksTask 1: Boot xv6Task 2: sleepTask 3: pingpongTask 4: primesTask 5: find 实验准备 这个 lab 用来学习尝试如何通过 system call 来实现常见的 shell 命令行程序&#xff0c;比如 ls、sleep、xargs 等。 实验官网 可以使用 docker 搭建实验环境&#x…

低代码UI构件程序设计基础实训一

步骤一 低代码在线调试工具 网址 低代码在线调试工具 步骤二 D盘建一个文件夹&#xff0c;文件夹下建两个文件夹ico和js 网上找一些图片&#xff0c;后缀.png&#xff0c;编号从0开始&#xff0c;图片另存到ico文件夹下 下载&#xff08;右键另存为&#xff09;以下四个页面…