当前位置: 首页 > 面试题库 >

了解Java的本机线程和jvm

轩辕天佑
2023-03-14
问题内容

我知道jvm本身就是将Java可执行文件的字节码转换为本地机器代码的应用程序,但是当使用本地线程时,我有一些我似乎无法回答的问题。

  • 是否每个线程都会创建自己的jvm实例来处理其特定执行?
  • 如果不是,那么jvm是否必须有某种方式来调度它接下来将处理的线程,如果是的话,由于一次只能运行一个线程,这是否会使java的多线程性质变得没有用?

问题答案:

是否每个线程都创建自己的JVM实例以处理其特定执行?

不。它们在同一个JVM中执行,以便(例如)它们可以共享对象和类属性。

如果不是,那么JVM是否必须有某种方式来调度它接下来要处理的线程

Java中有两种线程实现。本机线程映射到由主机OS实现的线程抽象。操作系统负责本机线程调度和时间分片。

第二种线程是“绿色线程”。这些由JVM本身实现和管理,而JVM实现线程调度。自Java 1.2以来,Sun / Oracle
JVM不支持Java绿色线程实现。(请参阅绿色线程与非绿色线程)

如果是这样,那么由于一次只能运行一个线程,这是否会使Java的多线程性质无用?

现在我们正在谈论绿色线程,这从Java角度来看(仅)具有历史意义。

  • 绿色线程的优点是在非I / O情况下调度和上下文切换更快。(基于在Linux 2.2上使用Java进行的测量;http://citeseerx.ist.psu.edu/viewdoc/summary?doi = 10.1.1.8.9238)

  • 使用纯绿色线程,将N个编程语言线程映射到单个本机线程。如前所述,在此模型中您无法获得真正的并行执行。

  • 在混合线程实现中,将N个编程语言线程映射到M个本机线程(其中N> M)。在此模型中,进程内线程调度程序负责绿色线程到本机线程的调度,并且您将获得真正的并行执行(如果M> 1)。

但是,即使有了纯绿色线程,您仍然可以获得并发性。控制被切换到另一个线程,这些线程在I /
O操作上被线程阻塞,立即获取锁,依此类推。此外,JVM的运行时可以实现定期的线程抢占,以便CPU密集型线程不会将(单个)核心独占为其他线程的排斥对象



 类似资料:
  • 问题内容: 绿色线程和本机线程有什么区别? 为什么将其命名为绿色和原生? 我是编程世界的新手。我喜欢学习Java。在经历Java线程面试问题时,我发现了这一点。我听说过线程,但是没有听说过这些绿色线程和本地线程。我对绿色线程和本机线程感到困惑,但不清楚。 在这种情况下,线程被称为绿色线程还是本地线程?(我的意思是在编程中) 问题答案: 绿色线程和本机线程有什么区别? 绿色线程由虚拟机调度。 本机线

  • 我为我的应用程序运行了这段代码 我得到了以下结果 {Thread[pool-1-thread-1,5,main]=[Ljava.lang.StackTraceElement;@E21F0DC,Thread[queued-work-looper,5,main]=[Ljava.lang.StackTraceElement;@1FEC5E5,Thread[FinalizerWatchdogDaemon,

  • 我有一个Android应用程序,它由一些本机线程(未连接到JVM)组成,需要能够调用Java对象的方法。 我打算这样做的方式是创建一个JNI函数,我从相关的Java对象调用它,它允许我在静态本机数据结构中获取和缓存所需的java对象方法ID、JNIEnv和对象引用,以便我的本机线程可以(线程安全地)访问所需的方法(例如,使用(*env)- 我不相信这种方法会起作用,因为我读到JNIEnv指针不能在

  • 考虑以下内核: 多线程单块: 现在1将从单个块启动请求的线程数,但最大线程数限制为1024(我的硬件)。只需生成另一个块。 2从多个块中启动请求数量的线程。现在,可以启动的最大线程数增加到了65535 * 1024。 3是块步幅循环,4是网格步幅循环。 我不明白的是3和4是如何迭代的?我读过的几篇文章中,状态网格步幅循环在批中迭代,这意味着什么? 调用时从3输出,作为内核执行 有时切换发生在0,1

  • 我使用Datadog与elasticsearch的集成来监控ES集群,它在仪表板上显示的一个重要指标是活动和等待搜索线程的数量。参考这个ES文档,我知道搜索线程在ES中的一个请求队列上工作,该队列的固定大小为1000。 如图所示,我看到很多等待线程,但这里没有解释拒绝队列异常。所以这意味着ES没有拒绝请求,但搜索线程仍然无法足够快地执行请求,因此最终处于等待状态很长一段时间。 问题 搜索请求队列的

  • 总结:当从本机创建的线程上的本机代码调用Java时,我看到Java线程泄漏。 (2014年2月11日更新:我们向Oracle提出了支持请求。Oracle已在Java 7 Update 45上确认了这一点。它只影响64位Linux(可能还有Mac)平台:32位Linux不受影响)。 (2014年4月29日更新:Oracle对此问题进行了修复,并将在Java 7 Update 80中发布)。 我有一个