多线程和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,一经查实,立即删除!

相关文章

采用intellij idea作为IDE的java项目由于*.iml文件导致无法编译问题

将项目中所有的iml文件删除&#xff0c;然后idea重新打开项目、编译&#xff0c;问题解决。 从git上将spring boot项目下载&#xff0c;用intellij idea打开&#xff0c;结果无法编译&#xff0c;提示“程序包com.fasterxml.jackson.core不存在”。编译来编译去&#xff0c;又…

口语化描述Maven的依赖范围(scope),简略不详细

文章目录 一、compile&#xff08;默认范围&#xff09;二、test&#xff08;用于测试&#xff09;三、provide四、import&#xff08;用来管理依赖版本&#xff09;五、system六、runtime版本仲裁 一、compile&#xff08;默认范围&#xff09; 范围最大哪里都能用 二、test…

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采样数…

【PostgreSQL】约束-排他约束

【PostgreSQL】约束链接 检查 唯一 主键 外键 排他 排他约束 排他约束是一种数据库约束&#xff0c;用于确保某一列或多个列中的值在每一条记录中都是唯一的。这意味着任何两条记录都不能具有相同的值。 排他约束可以在数据库中创建唯一索引或唯一约束来实现。当尝试插入或更…

CTFHub | 存储型

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

SQLServer性能优化分析--执行计划、耗时SQL排查和死锁处理

目录 1 常用系统存储过程2 查看执行计划3 查看磁盘使用率&#xff08;STATISTICS IO&#xff09;4 查询时间耗时较长的语句5 死锁处理 1 常用系统存储过程 1.1 查询表结构 EXEC sp_columns your_table, column_name table_column1.2 查询表索引 EXEC sp_helpindex your_tab…

linux usb 驱动之创urb的创建和销毁

struct urb 结构在驱动中必须不被静态创建, 或者在另一个结构中, 因为这可能破坏 USB 核心给 urb 使用的引用计数方法. 它必须使用对 usb_alloc_urb 函数的调用而被创 建. 这个函数有这个原型: struct urb *usb_alloc_urb(int iso_packets, int mem_flags); 第一个参数, iso_pa…

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

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

偌依 项目部署及上线步骤

准备实验环境&#xff0c;准备3台机器 1.作为前端服务器&#xff0c;mysql,redis服务器--同时临时作为代码打包服务器 192.168.2.65 nginx-server 2.作为后端服务器 192.168.2.66 java-server-1 192.168.2.67 java-server-2 安装nginx/mysql #安装nginx [rootweb-nginx ~]…

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

随着“南方小土豆勇闯哈尔滨”的词条霸榜热搜&#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;希望能对你有所帮助。 拾取坐标…

trino 433 开启密码验证

什么要开启密码验证 因为不加密的话&#xff0c;所有人都可以查询所配置的数据库 摘要 采用最简单的账号密码认证。 准备 trino 已经开启了https。trino 开启httpspassword.db。用户密码文件&#xff0c;一行就是一个用户名密码&#xff0c;用户密码用:隔开&#xff0c;比…

AUTOSAR系统服务篇-WdgM

文章目录 简介受监督的实体和校验点监督机制的交互监督函数存活监督(Alive Supervision)死线监督逻辑监督看门狗处理错误处理受监督实体中的错误处理硬件狗复位立即MCU复位术语功能详述监督功能的交互综述本地监督状态

【代码解析】代码解析之登录(2)

PostMapping("/login")public R<Employee> login(HttpServletRequest request, RequestBody Employee employee){//将页面提交的密码password&#xff0c;进行md5加密处理String password employee.getPassword();password DigestUtils.md5DigestAsHex(passw…

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

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

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

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