Java面试题,Java虚拟机相关内容面试题及答案

McGovernTheory在StackOverflow提了这样一个问题:Java虚拟机最多支持多少个线程?跟虚拟机开发商有关么?跟操作系统呢?还有其他的因素吗?

其实这取决于你使用的CPU,操作系统,其他进程正在做的事情,你使用的Java的版本,还有其他的因素。我曾经见过一台Windows服务器在宕机之前有超过6500个线程。当然,大多数线程什么事情也没有做。一旦一台机器上有差不多6500个线程(Java里面),机器就会开始出问题,并变得不稳定。

以我的经验来看,JVM容纳的线程与计算机本身性能是正相关的。当然了,你要有足够的本机内存,并且给Java分配了足够的内存,让每个线程都可以拥有栈(虚拟机栈),可以做任何想做的事情。任何一台拥有现代CPU(AMD或者是Intel最近的几代)和1-2G内存(取决于操作系统)的机器很容易就可以支持有上千个线程的Java虚拟机。

如果你需要一个更精确的答案,最好是自己做压测。

这里有很多的参数(可以设置)。对于特定的虚拟机,都会有自己的运行时参数。(最大线程数)一定程度上由操作系统决定的:底层的操作系统要给线程提供哪些支持?施加哪些限制?虚拟机使用的是原生的操作系统的线程还是red thread或者green thread?

操作系统提供的支持是另一个问题。如果你向下面这样写Java程序:

class DieLikeADog {

public static void main(String[] argv){

for(;;){

new Thread(new SomeRunaable).start();

}

}

}

(不要抱怨语法细节,这才刚刚开始)那你当然希望能得到成百上千个运行的线程。但是,创建一个线程的成本是相对较大的,(过多线程)调度的开销会变得突出。能否让这些线程做有用的事情还不确定。

升级版

好了,迫不及待了!下面是我的一个加了点润色的小的测试程序:

public class DieLikeADog {

private static Object s = new Object();

private static int count = 0;

public static void main(String[] argv){

for(;;){

new Thread(new Runnable(){

public void run(){

synchronized(s){

count += 1;

System.err.println("New thread #"+count);

}

for(;;){

try {

Thread.sleep(1000);

} catch (Exception e){

System.err.println(e);

}

}

}

}).start();

}

}

}

在Intel的OS/X 10.5.6系统上,Java 5的输出如下:

New thread #2547

New thread #2548

New thread #2549

Can‘t create thread: 5

New thread #2550

Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread

at java.lang.Thread.start0(Native Method)

at java.lang.Thread.start(Thread.java:592)

at DieLikeADog.main(DieLikeADog.java:6)

读了Charlie Martin的回复以后,我很想知道堆内存的大小是否能够给创建的线程数带来不同,然后我就被结果惊呆了:在Vista Home Premium SP1系统上,使用JDK 1.6.0_11,设置堆内存的大小从2M到1024M来执行Charlie的测试程序。比如:创建2M的堆内存,我使用的虚拟机参数是:-Xms2m -Xmx2m.

下面是我的测试结果:

2 mb --> 5744 threads

4 mb --> 5743 threads

8 mb --> 5735 threads

12 mb --> 5724 threads

16 mb --> 5712 threads

24 mb --> 5687 threads

32 mb --> 5662 threads

48 mb --> 5610 threads

64 mb --> 5561 threads

96 mb --> 5457 threads

128 mb --> 5357 threads

192 mb --> 5190 threads

256 mb --> 5014 threads

384 mb --> 4606 threads

512 mb --> 4202 threads

768 mb --> 3388 threads

1024 mb --> 2583 threads

所以,堆的大小确实很重要。但是,堆大小和最大线程数却是呈反比例关系。这太诡异了!

绝对理论上的最大线程数是进程的用户地址空间除以线程栈的大小(现实中,如果内存全部给线程栈使用,就不会有能运行的程序了)。因此,以32位Windows系统为例,每一个进程的用户地址空间是2G,假如每个线程栈的大小是128K,最多会有16384(=210241024 / 128)个线程。实际在XP系统上,我发现大约能启动13000个线程。

然后,我认为,你的问题本质上是:(a)你是否可以在你的代码中有效的管理许多的线程,不让他们做很显然是愚蠢的事情(比如:让他们在同一个object对象上等待随后被调用notifyAll()…),(b)操作系统是否可以有效地管理这许多线程。基本上来说,如果(a)的答案是”yes”的话,(b)的答案也是”yes”。

很巧的是,你可以在Thread的构造函数中设置线程栈的大小,但是,你不需要也不应该把这个和虚拟机参数弄混淆。

原文地址:https://blog.51cto.com/14214237/2411194

时间: 2024-10-28 19:59:09

Java面试题,Java虚拟机相关内容面试题及答案的相关文章

java的static块及相关内容

原文地址:http://blog.csdn.NET/lubiaopan/article/details/4802430     感谢原作者! static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法,下面我们详细的讨论一下该语句块的特性及应用. 一.在程序的一次执行过程中,static{}语句块中的内容只被执行一次,看下面的示例: 示例一 [java] view plaincopy class Test{ public static in

关于使用java开发Mis系统的相关内容。

怎样使用java编程语言开发一个小型的信息管理系统,首先我们要知道用什么样的方法来开发这一系统. 1.java简单基础知识: (1)Java的三种技术架构: 1)JAVAEE:Java Platform Enterprise Edition,开发企业环境下的应用程序,主要针对web程序开发: 2)JAVASE:Java Platform Standard Edition,完成桌面应用程序的开发,是其它两者的基础: 3)JAVAME:Java Platform Micro Edition,开发电子

java面试题全集(中)--Java Web和Web Service相关面试题

这部分主要是与Java Web和Web Service相关的面试题. 96.阐述Servlet和CGI的区别? 答:Servlet与CGI的区别在于Servlet处于服务器进程中,它通过多线程方式运行其service()方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于Servlet. 补充:Sun Microsystems公司在1996年发布Servlet技术就是为了和CGI进行竞争,Servlet是一个特殊的Java程

Java虚拟机相关知识整理

1.java的内存区域 线程共享 (1)堆:是java虚拟机所管理的内存中最大一块,用于存放对象实例,所有对象实例和数组都在堆上分配 基于垃圾收集器分为新生代和老年代,并可以进一步划分为Eden,survivor,默认比例为8:1 Eden.From survivor.To survivor三个部分 依据是否开启线程私有的分配缓冲区(TLAB) 也存在OutOfMemoryError异常 (2)方法区:类信息,常量,静态变量等编译器编译之后的代码等数据 会产生内存OutOfMemoryError

面试题——Java虚拟机

一.运行时数据区域 Java虚拟机在执行Java程序的时候会把它所管理的内存划分为若干个不同的数据区域,这些区域各有用途: 程序计数器:(线程私有的) 程序计数器是一块较小的内存,可以看作是当前线程所执行的字节码的行号指示器,字节码解释器工作时通过改变这个计数器的值来选取下一条指令. Java虚拟机栈:(线程私有) Java虚拟机栈描述的是Java方法执行的内存模型,每个方法执行的同时会创建一个栈帧,用来存储局部变量表,操作数栈,动态链接,方法出口等信息. 本地方法栈:(线程私有): 本地方法栈

Java面试题整理(题目内容非原创)

java 基础面试题 Java基础中对于io 中文件的读.写,util中的list map set这些要分清楚 还有线程.socket 都需要了解下 参考链接:http://blog.csdn.net/jackfrued/article/details/44921941 数据库的面试题 参考链接:http://blog.csdn.net/zhanghaotian2011/article/details/8904365 js.jsp面试题 js问题一般会问ajax的原理 参数传递 ,以及正则表达式

java学习--基础知识阶段性总结--基础面试题

1. 静态变量和实例变量的区别 局部变量不能用静态的,如果用了静态的,则不会从静态区消失 * 静态变量也叫类变量  成员变量也叫对象变量 * A:所属不同 * 静态变量属于类,所以也称为为类变量 * 成员变量属于对象,所以也称为实例变量(对象变量) * B:内存中位置不同 * 静态变量存储于方法区的静态区 * 成员变量存储于堆内存 * C:内存出现时间不同 * 静态变量随着类的加载而加载,随着类的消失而消失 * 成员变量随着对象的创建而存在,随着对象的消失而消失 * D:调用不同 * 静态变量可

面试题---Java基础

1.面向对象的特征有哪些方面?答:面向对象的特征主要有以下几个方面:- 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面.抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么.- 继承:继承是从已有类得到继承信息创建新类的过程.提供继承信息的类被称为父类(超类.基类):得到继承信息的类被称为子类(派生类).继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段- 封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只

Java SE应用程序设计视频教程相关de介绍

Java SE应用程序设计视频教程的内容由浅入深,包括Java程序设计基础.面向对象程序设计.接口.内部类.异常处理.断言.集合框架等基础知识.如果您有意学习这方面知识,参考这部教程学习绝对错不了. Java是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称.用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台.动态的Web.Internet计算.从此,Java被广泛接受并推动了Web的迅速发展,常用的