首页 > 其他分享 >JVM线程

JVM线程

时间:2023-08-18 19:11:05浏览次数:29  
标签:垃圾 回收 算法 线程 引用 JVM 内存

1.JVM概念

包括一套字节码指令集 一组寄存器 一个栈 一个垃圾回收 一个堆 一个存储方法域。
Java源文件(通过编译器)-> 字节码文件(通过JVM)-> 机器码

2.线程

JVM允许一个应用并发执行

3.内存区域

3.1 线程私有区域 Thread Local

3.2 线程共享区域 Thread Shared

3.2.1 方法区(永久代)

用于存储被JVM加载的类信息,常量,静态变量,被编译器编译后的代码等数据。Class在被加载时候被放入永久区域,GC不会在主程序运行期间对永久代区域进行清理,最终会OOM异常。

  • Java8中,永久代被移除,被元数据区取代,其不在虚拟机中,使用本地内存。

3.2.2 类实例区(Java堆)

  • 新生代
    存放新生对象 占据1/3空间,会频繁触发MinorGC进行垃圾回收
    分为Eden,ServivorFrom,ServivorTo三个区
    -- Eden: 新对象的出生地(占用内存大直接分配老年代),内存不够触发MinorGC,对新生代进行垃圾回收。
    -- ServivorFrom:上一次GC的幸存者,作为这次GC被扫描者
    -- ServivorTo: 保留了一次MinorGC过程中的幸存者
  • 老年代
    存放生命周期长的内存对象,比较稳定。进行MajorGC前一般先进行MinorGC。无法找到足够大的连续空间分配给新建的较大对象也会触发MajorGC进行垃圾回收
  • 异常

3.3 直接内存 Dirct Memory

4.垃圾回收算法

4.1 确定垃圾

  • 引用计数法
  • 可达性分析
  • 标记清除算法
  • 复制算法
  • 标记整理算法
  • 分代收集算法

4.2 引用类型

  • 强引用:把一个对象赋给一个引用变量,这个引用变量就是一个强引用。其不可能被垃圾回收机制回收,会造成内存泄漏
  • 软引用:用SoftReference类实现,对于只有软引用对象,内存足够时不会回收,不足时会被回收
  • 弱引用:WeakReference类实现,只要垃圾回收机制一运行,就会被回收
  • 虚引用:PhantomReference类实现,必须和引用队列联合使用。主要作用:跟踪对象被垃圾回收的状态

4.3 GC分代收集算法

  • 新生代:复制算法
  • 老年代:标记清除、整理算法

4.4 分区收集算法

将堆空间划分为连续的不同小区间,每个小区间独立使用,独立回收,控制一次回收多少个小区间。

标签:垃圾,回收,算法,线程,引用,JVM,内存
From: https://www.cnblogs.com/lwx11111/p/17641403.html

相关文章

  • 记录一次线程间通信PostThreadMessage(张三不是張三,张三是张三)
    事情是这样的,想使用线程间通信ChatGPT走一波usingSystem;usingSystem.Runtime.InteropServices;usingSystem.Threading;publicclassProgram{//定义常量,表示自定义消息privateconstintWM_CUSTOM_MESSAGE=0x0400;//定义用于接收消息的消息循环......
  • 线程管理
    一、基本概念1、线程是进程的执行路线,它是进程内部的控制序列,线程是进程的一部分,进程是一个资源单位,而线程是执行单位,线程是进程执行的实体,负责真正的执行2、线程是轻量级的,没有自己的代码段、数据段、bss段、堆、环境变量、命令行参数、文件描述符、信号处理函数、当前工作目录......
  • SimpleDateFormat 线程安全问题修复方案
    问题介绍在日常的开发过程中,我们不可避免地会使用到JDK8之前的Date类,在格式化日期或解析日期时就需要用到SimpleDateFormat类,但由于该类并不是线程安全的,所以我们常发现对该类的不恰当使用会导致日期解析异常,从而影响线上服务可用率。以下是对SimpleDateFormat类不恰当......
  • java线程死锁怎么处理
    在Java中,线程死锁是指两个或多个线程被阻塞,因为它们互相等待对方释放资源。这种情况下,线程将永远无法继续执行下去。处理线程死锁的方法之一是使用以下步骤:1.分析死锁:确定哪些线程和资源参与了死锁,并找出造成死锁的原因。你可以使用工具如线程转储分析工具(ThreadDumpAnalyzer)或......
  • 【Java技术专题】「入门到精通系列教程」深入探索Java特性中并发编程体系的原理和实战
    并发编程介绍当今软件开发领域越来越强调性能和伸缩性,因此,利用并发编程可以更好地利用计算资源,提高应用程序的性能和响应速度。以下是一些关于并发编程的相关信息供您参考。什么是并发编程并发编程是指在一个程序中同时执行多个独立的计算任务,并通过各种手段来协调不同任务之间的交......
  • C++ 多线程详解之异步编程 std::packaged_task
    std::packaged_task将任何可调用对象(比如函数、lambda表达式等等)封装成一个task,可以异步执行。执行结果可以使用std::future获取。比如下面的例子,构造一个std::packaged_task后,get_future()函数返回一个std::future对象,可以获取task异步或者同步执行的结果。#includ......
  • 线程与进程的区别
    线程与进程的区别?线程是指进程内的一个执行单元,也是进程内的可调度实体.与进程的区别:地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源线程......
  • JVM
    JVM1.JVM的位置运行在操作系统上2.jvm的体系结构3.类加载器作用:加载class文件虚拟机自带的加载器启动类(根)加载器:JAVA_HOME\lib\jar包orrt.jar扩展类加载器:JAVA_HOME\lib\ext应用程序(用户)加载器:classpath4.双亲委派机制为了保证安全:自定义-->app->ex......
  • 远程调试&线程检查&性能检查
    vs2022的一些调试技巧——远程调试&线程检查&性能检查visualstudio一直都是.net/c#开发人员最受欢迎的编译器,除了强大的代码提示和项目模板,还拥有大量的调试工具,这一期我们介绍下codefreeze阶段的一些调试技巧。包括测试环境/生产环境下的远程调试,线程调试,以及性能监控调试。......
  • 在C++中实现多线程异步TCP消息发送
    本文主要解释了在C++中如何实现一个多线程,异步发送TCP消息的系统。我们将会用到C++的标准库和Boost.Asio库。基础知识TCP(TransmissionControlProtocol):是一种面向连接的、可靠的、基于字节流的通信协议。它在两个网络节点之间创建一个稳定的连接,以便可以交换字节流。多线程编程:......