Java虚拟机层面所暴露给我们的状态,与操作系统底层的线程状态是两个不同层面的事。具体而言,这里说的 Java 线程状态均来自于 Thread 类下的 State 这一内部枚举类中所定义的状态:
Java虚拟机层面所暴露给我们的状态,与操作系统底层的线程状态是两个不同层面的事。
Java 虚拟机层面所暴露给我们的状态,与操作系统底层的线程状态是两个不同层面的事。具体而言,这里说的 Java 线程状态均来自于 Thread 类下的 State 这一内部枚举类中所定义的状态:
在Java出现之前,像C/C++这样的编译型语言写出来的代码经过编译后,得到的是可直接在某平台(Windows或Linux)上执行的机器码,即machine code,machine code其实就是native code,它直接和操作系统交互。
有人常觉得 Java 线程状态中还少了个 running 状态,这其实是把两个不同层面的状态混淆了。对 Java 线程状态而言,不存在所谓的running 状态,它的 runnable 状态包含了 running 状态。
Java 中的虚拟线程,也叫做协程或“轻量级线程”,它诞生于 JDK 19(预览 API),正式发布于 JDK 21,它是一种在 Java 虚拟机(JVM)层面实现的逻辑线程,不直接和操作系统的物理线程一一对应,因此它可以减少上下文切换所带来的性能开销。
使用 Java 阻塞 I/O 模型读取数据,将会导致线程阻塞,线程将会进入休眠,从而让出 CPU 的执行权,直到数据读取完成。这个期间如果使用 jstack 查看线程状态,却可以发现Java 线程状态是处于 RUNNABLE,这就和上面说的存在矛盾,为什么会这样?
在Thread类中有内部类 枚举State,用于抽象描述Java线程的状态,共有6种不同的状态
JVM本质就是一个进程,因此其内存空间(也称之为运行时数据区,注意与JMM的区别)也有进程的一般特点。深入浅出 Java 中 JVM 内存管理,这篇参考下。
一、操作系统中线程和进程的概念 现在的操作系统是多任务操作系统。多线程是实现多任务的一种方式。 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。比如在Windows系统中,一个运行的exe就是一个进程。 线程是指进程中的一个执行流程,一个进程中可以运行多个线程。比如java.exe进程中可以运行很多线程。线程总是属于某个进程,进程中的多个线程共享进程的内存。 “同时”执行是人的感觉,在线程之间实际上轮换执行。 二、Java中的线程 在Java中,“线程”指两件不同的事情: 1、java.lang.Thread类的一个实例; 2、线程的执行。 使用java.lang.Thread类或者java.lang.Runnable接口编写代码来定义、实例化和启动新线程。 一个Thread类实例只是一个对象,像Java中的任何其他对象一样,具有变量和方法,生死于堆上。 Java中,每个线程都有一个调用栈,即使不在程序中创建任何新的线程,线程也在后台运行着。 一个Java应用总是从main()方法开始运行,mian()方法运行在一个线程内,它被称为主线程。 一旦创建一个新的线程,就产生一个新的调用栈。 线程总体分两类:用户线程和守候线程。 当所有用户线程执行完毕的时候,JVM自动关闭。但是守候线程却不独立于JVM,守候线程一般是由操作系统或者用户自己创建的。 三、java何时会创建新的线程? 答:java中所有的线程都必须通过new Thread()或实现Runnable,显式的创建新线程。调用其他类的方法、访问字段等操作都是在同一个线程里进行的,不会创建新的线程。 可以分为两种情况: 1、由JVM自动创建的,如:垃圾收集线程--启动时创建 2、由用户创建的。 测试代码:
每个java开发同学不管是日常工作中还是面试里,都会遇到JDK、JVM和GC的问题。本文会从以下10个问题为切入点,带着大家一起全面了解一下JVM的方方面面。
(1)自我介绍 (2)JVM如何加载一个类的过程,双亲委派模型中有哪些方法? (3)HashMap如何实现的? (4)HashMap和Concurrent HashMap区别, Concurrent
JVM(Java Virtual Machine)是Java运行的基石。它向下通过映射规则关联并操作所有操作系统,向上提供一系列的JavaAPI。是Java与硬件无关,与操作系统无关,跨平台运行的关键存在。
这还用说么,操作系统不就是Windows、Linux、Mac、IOS、Android、IOS这类我们天天都在用的东西么?
今天下午把 JavaGuide[1]上 MySQL 以及书单部分的内容完善了一下。
Synchronized(对象锁)和Static Synchronized(类锁)的区别
OkHttp是一个关于网络请求的第三方类库,其中封装了网络请求的get、post等操作的底层实现,是Android端目前最为火热的网络请求框架之一。
是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。
在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约 600m,Linux自身使用大约800m。
我们知道,Java程序的运行需要一个运行时环境,即:JVM,启动Java进程即启动了一个JVM。 因此,所谓停止Java进程,本质上就是关闭JVM。 那么,哪些情况会导致JVM关闭呢?
线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。
在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约 600m,Linux自身使用大约800m。从表面上,物理内存应该是足够使用的;但实际运行的情况是,会发生大量使用SWAP(说明物理内存不够使用 了),如下图所示。由于SWAP和GC同时发生会致使JVM严重卡顿,所以我们要追问:内存究竟去哪儿了?
有位小伙伴在我的粉丝群里面问我一个面试题,说面试被问对JVM的理解,不知道怎么回答,今天咱们来聊透,就算是八股文你也得会。另外,往期面试题解析中配套的文档我已经准备好,想获得的可以在文章底部加我\/领取!
经常有同学分不清进程和线程的区别,今天刚好有空就整理了一份文章,方便大家区分进程和线程.定义不同:进程是操作系统资源分配的基本单位(说直白点就是指正在运行的程序),而线程是任务调度和执行的基本单位(说直白点就是程序中的一条执行线路)Java开发学习中线程和进程的区别
java方面 java中的引用有几种? Java中的threadlocal是怎么用的? threadlocal中的内部实现是怎么样的? 哪种引用? java中的"final"关键字在多线程的语义中,有
大家好,又见面了,我是你们的朋友全栈君。 1.什么是jvm? (1)jvm是一种用于计算设备的规范,它是一个虚构出来的机器,是通过在实际的计算机上仿真模拟各种功能实现的。 (2)jvm包含一
当两个线程竞争同一资源的时候,如果对资源的访问顺序敏感,就称存在竞态条件。导致竞态条件发生的代码区称作临界区。
一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间,一个进程可以有多个线程,比如在Windows系统中,一个运行的xx.exe就是一个进程。
JDK:Java Development Kit Java开发工具包【开发Java程序用】
知道了这 4 个部分之后,我们来验证一下底层。借助于第三方包 JOL = Java Object Layout java 内存布局去看看。很简单的几行代码就可以看到内存布局的样式:
整体来说,一面的基础性问题比较多,所以博主基本都答出来了,准备过还是有些用处的。所以一面完了感觉还不错,接着第二天下午就二面了。
1.等待阻塞(无限期等待):运行的线程执行wait()方法,该线程会释放占用的资源,JVM会把该线程放入等待池.进入这个状态后,线程不会自动唤醒,必须依靠其它线程调用notify()或notifyAll()方法才能会被唤醒.
现如今,一个服务端应用程序几乎都会使用到多线程来提升服务性能,而目前服务端还是以linux系统为主。一个多线程的java应用,不管使用了什么样的同步机制,最终都要用JVM执行同步处理,而JVM本身也是linux上的一个进程,那么java应用的线程同步机制,可以说是对操作系统层面的同步机制的上层封装。这里我说的操作系统,主要是的非实时抢占式内核(non-PREEMPT_RT),并不讨论实时抢占式内核(PREEMPT_RT) 的问题,二者由于使用场景不同,因此同步机制也会存在差异或出现变化。
在jvm中有很多的参数可以进行设置,这样可以让jvm在各种环境中都能够高效的运行。绝大部分的参数保持默认即可。
虚拟线程(Virtual Thread)也称协程或纤程,是一种轻量级的线程实现,与传统的线程以及操作系统级别的线程(也称为平台线程)相比,它的创建开销更小、资源利用率更高,是 Java 并发编程领域的一项重要创新。
现在多核 CPU 是主流。利用多核技术,可以有效发挥硬件的能力,提升吞吐量,对于 Java 程序,可以实现并发垃圾收集。但是 Java 利用多核技术也带来了一些问题,主要是多线程共享内存引起了。目前内存和 CPU 之间的带宽是一个主要瓶颈,每个核可以独享一部分高速缓存,可以提高性能。JVM 是利用操作系统的”轻量级进程”实现线程,所以线程每操作一次共享内存,都无法在高速缓存中命中,是一次开销较大的系统调用。所以区别于普通的优化,针对多核平台,需要进行一些特殊的优化。
因为JAVA程序编译后生成的字节码文件(class文件)是跨平台的。JVM不是跨平台,在不同的操作系统上开发JAVA程序,必须安装该操作系统版本的JVM。
最近重新开始阅读《深入了解Java虚拟机》这本书,就想着用一个系列文章来记录和分享自己的心得。为什么要说”重新“呢?是因为这本书我在多年前就买了,中间也曾翻来覆去的看过。这个”翻来覆去“可以说是非常的生动形象,因为我不仅从前往后看,也从后往前看了这本书。但是,这并不是一个值得骄傲的过程,因为我之前看的时候经常被卡住(俗称看不懂),导致我中途放弃。再次拾起的时候为了多一些新鲜感,就尝试从后往前看,事实证明效果依旧不佳。今年我又拿起这本书(生活所迫),这次阅读下来,相比之前要流畅许多,可能是因为有了一些工作经验吧(社会的毒打)。感觉这本书难以坚持阅读主要有几个几个原因:
今天在阅读ThreadPoolExecutor源码的时候觉得有些地方理解起来似是而非,很别扭!最后才猛然发现,原来是我自己的问题:没有真正理解Runnable和Thread的含义! 我之前对于Runnable和Thread理解的误区在于:“Runnble和Thread是实现多线程的两种方式,在Java中要实现多线程运行要么实现Runnable接口,要么继承Thread类”。咋一看对于这样的描述似乎也没毛病,但是它没有真正阐述清楚诸如“如何在Java中实现一个线程运行”,“Runnable与Thread的区别是什么”这样的问题。而且我看网上很多中文博客对于类似Runnable与Thread的区别这样的讨论也都大同小异,人云亦云,还是没有真正解答我心中的疑惑。
如果觉得内容不错的话,希望大家可以帮忙点赞转发一波,这是对我最大的鼓励,感谢🙏🏻
领取专属 10元无门槛券
手把手带您无忧上云