论坛首页 Java企业应用论坛

一个java面试题

浏览 13804 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-06-19  
根据上面的哥们的提示,改进了下
static void change2(){
		String str = new String("a  a  b  c j iz c q cc  dd");
		try {
			Field f_value = str.getClass().getDeclaredField("value");
			Field f_count = str.getClass().getDeclaredField("count");
			Field f_hash = str.getClass().getDeclaredField("hash");
			f_value.setAccessible(true);
			f_count.setAccessible(true);
			f_hash.setAccessible(true);
			int count = f_count.getInt(str);
			char[] chars =(char[])f_value.get(str);
			int c=f_hash.getInt(str);
			for(int i=0;i<chars.length;i++){
				if(chars[i]!=' ')  chars[c++]=chars[i];
				else	count--;
			}
			f_count.setInt(str, count);
			System.out.println(str);
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
	}
0 请登录后投票
   发表时间:2012-06-19   最后修改:2012-06-19
ray_linn 写道
cttnbcj 写道
静态针对的是jdk 假如分配了100M,调用静态类不需要jdk额外增加内存,但是jdk,只是封装了console,调用的黑黑的框,除非是jdk静态类是操作桌面屏幕直接在JDK中实现的,否则肯定要去操作系统层面,内存没了,你到系统层面调用,马上卡死。


内存耗尽也是只是Java本身进程的内存耗尽好不啦,在4G的进程空间里,你申请个2G的数组,Java的内存就会耗尽,但不等于物理内存耗尽好不。

牵涉到系统调用,都是在下2G内存空间里,这部分是保留的,再怎么也耗不到这里。


明显你对操作系统实现和硬件方面的编程不了解。
基本系统是分应用和内核  一般情况: 虚拟空间2G给内核,2G给应用。但是真实内存一般:32位系统是3G多点。
内核里面内存又分可换和非可换内存空间,非可换永久在内存中,除非手动释放,换页的在不用时会到硬盘页文件中,调用时候调入内存里。
内存耗尽也是只是Java本身进程的内存耗尽好不啦   我想你应该指的是,JAVA进程本身地址空间全部被分配,不能再分配新地址空间,导致JDK不能在申请内存和变量,数组,字符等。 然后调用API到系统层面时候,内核中物理内存还有空闲的。
可看清题目机子内存基本满了,这句话指的是 真实内存基本满了



0 请登录后投票
   发表时间:2012-06-19   最后修改:2012-06-19
cttnbcj 写道
ray_linn 写道
cttnbcj 写道
静态针对的是jdk 假如分配了100M,调用静态类不需要jdk额外增加内存,但是jdk,只是封装了console,调用的黑黑的框,除非是jdk静态类是操作桌面屏幕直接在JDK中实现的,否则肯定要去操作系统层面,内存没了,你到系统层面调用,马上卡死。


内存耗尽也是只是Java本身进程的内存耗尽好不啦,在4G的进程空间里,你申请个2G的数组,Java的内存就会耗尽,但不等于物理内存耗尽好不。

牵涉到系统调用,都是在下2G内存空间里,这部分是保留的,再怎么也耗不到这里。


明显你对操作系统实现和硬件方面的编程不了解。
基本系统是分应用和内核  一般情况: 虚拟空间2G给内核,2G给应用。但是真实内存一般:32位系统是3G。
内核里面内存又分可换和非可换内存空间,非可换永久在内存中,除非手动释放,换页的在不用时会到硬盘页文件中,调用时候调入内存里。
内存耗尽也是只是Java本身进程的内存耗尽好不啦   我想你应该指的是,JAVA进程本身地址空间全部被分配,不能再分配新地址空间,导致JDK不能在申请内存和变量,数组,字符等。 然后调用API到系统层面时候,内核中物理内存还有空闲的。
可看清题目机子内存基本满了,这句话指的是 真实内存基本满了





大侠,首先,32位系统的最大寻址空间是4G,这个可以自己算一下啦。估计您是受Windows毒害太深。
PS:是Win 7以前
0 请登录后投票
   发表时间:2012-06-19  
JonathanWang 写道
cttnbcj 写道
ray_linn 写道
cttnbcj 写道
静态针对的是jdk 假如分配了100M,调用静态类不需要jdk额外增加内存,但是jdk,只是封装了console,调用的黑黑的框,除非是jdk静态类是操作桌面屏幕直接在JDK中实现的,否则肯定要去操作系统层面,内存没了,你到系统层面调用,马上卡死。


内存耗尽也是只是Java本身进程的内存耗尽好不啦,在4G的进程空间里,你申请个2G的数组,Java的内存就会耗尽,但不等于物理内存耗尽好不。

牵涉到系统调用,都是在下2G内存空间里,这部分是保留的,再怎么也耗不到这里。


明显你对操作系统实现和硬件方面的编程不了解。
基本系统是分应用和内核  一般情况: 虚拟空间2G给内核,2G给应用。但是真实内存一般:32位系统是3G多点。
内核里面内存又分可换和非可换内存空间,非可换永久在内存中,除非手动释放,换页的在不用时会到硬盘页文件中,调用时候调入内存里。
内存耗尽也是只是Java本身进程的内存耗尽好不啦   我想你应该指的是,JAVA进程本身地址空间全部被分配,不能再分配新地址空间,导致JDK不能在申请内存和变量,数组,字符等。 然后调用API到系统层面时候,内核中物理内存还有空闲的。
可看清题目机子内存基本满了,这句话指的是 真实内存基本满了





大侠,首先,32位系统的最大寻址空间是4G,这个可以自己算一下啦。估计您是受Windows毒害太深。
PS:是Win 7以前

大虾,请看清我的红色字。谢谢

0 请登录后投票
   发表时间:2012-06-19   最后修改:2012-06-19
cttnbcj 写道
JonathanWang 写道
cttnbcj 写道
ray_linn 写道
cttnbcj 写道
静态针对的是jdk 假如分配了100M,调用静态类不需要jdk额外增加内存,但是jdk,只是封装了console,调用的黑黑的框,除非是jdk静态类是操作桌面屏幕直接在JDK中实现的,否则肯定要去操作系统层面,内存没了,你到系统层面调用,马上卡死。


内存耗尽也是只是Java本身进程的内存耗尽好不啦,在4G的进程空间里,你申请个2G的数组,Java的内存就会耗尽,但不等于物理内存耗尽好不。

牵涉到系统调用,都是在下2G内存空间里,这部分是保留的,再怎么也耗不到这里。


明显你对操作系统实现和硬件方面的编程不了解。
基本系统是分应用和内核  一般情况: 虚拟空间2G给内核,2G给应用。但是真实内存一般:32位系统是3G多点。
内核里面内存又分可换和非可换内存空间,非可换永久在内存中,除非手动释放,换页的在不用时会到硬盘页文件中,调用时候调入内存里。
内存耗尽也是只是Java本身进程的内存耗尽好不啦   我想你应该指的是,JAVA进程本身地址空间全部被分配,不能再分配新地址空间,导致JDK不能在申请内存和变量,数组,字符等。 然后调用API到系统层面时候,内核中物理内存还有空闲的。
可看清题目机子内存基本满了,这句话指的是 真实内存基本满了





大侠,首先,32位系统的最大寻址空间是4G,这个可以自己算一下啦。估计您是受Windows毒害太深。
PS:是Win 7以前

大虾,请看清我的红色字。谢谢

处理器架构提供的部分可寻址范围由 OS 本身占用,提供给操作系统内核以及 C 运行时(对于使用 C 或者 C++ 编写的 JVM 而言)。OS 和 C 运行时占用的内存数量取决于所用的 OS,但通常数量较大:Windows 默认占用的内存是 2GB。剩余的可寻址空间(用术语来表示就是用户空间)就是可供运行的实际进程使用的内存。

 

默认情况下,32 位 Windows 拥有 2GB 用户空间和 2GB 内核空间。在一些 Windows 版本上,通过向启动配置添加 /3GB 开关并使用 /LARGEADDRESSAWARE 开关重新链接应用程序,可以将这种平衡调整为 3GB 用户空间和 1GB 内核空间。在 32 位 Linux 上,默认设置为 3GB 用户空间和 1GB 内核空间。一些 Linux 分发版提供了一个 hugemem 内核,支持 4GB 用户空间。为了实现这种配置,将进行系统调用时使用的地址空间分配给内核。通过这种方式增加用户空间会减慢系统调用,因为每次进行系统调用时,操作系统必 须在地址空间之间复制数据并重置进程地址-空间映射。

 

对于 Java 应用程序,用户空间是 Java 进程占用的内存,实际上包含两个池:Java 堆和本机(非 Java)堆。Java 堆的大小由 JVM 的 Java 堆设置控制:-Xms-Xmx 分别设置最小和最大 Java 堆。在按照最大的大小设置分配了 Java 堆之后,剩下的用户空间就是本机堆。图 1 展示了一个 32 位 Java 进程的内存布局:


图 1. 一个 32 位 Java 进程的内存布局示例
一个 32 位 Java 进程的内存布局示例视图

图 1 中,可寻址范围总共有 4GB,OS 和 C 运行时大约占用了其中的 1GB,Java 堆占用了将近 2GB,本机堆占用了其他部分。请注意,JVM 本身也要占用内存,就像 OS 内核和 C 运行时一样,而 JVM 占用的内存是本机堆的子集。



 

0 请登录后投票
   发表时间:2012-06-19  
cttnbcj 写道


明显你对操作系统实现和硬件方面的编程不了解。
基本系统是分应用和内核  一般情况: 虚拟空间2G给内核,2G给应用。但是真实内存一般:32位系统是3G多点。
内核里面内存又分可换和非可换内存空间,非可换永久在内存中,除非手动释放,换页的在不用时会到硬盘页文件中,调用时候调入内存里。
内存耗尽也是只是Java本身进程的内存耗尽好不啦   我想你应该指的是,JAVA进程本身地址空间全部被分配,不能再分配新地址空间,导致JDK不能在申请内存和变量,数组,字符等。 然后调用API到系统层面时候,内核中物理内存还有空闲的。
可看清题目机子内存基本满了,这句话指的是 真实内存基本满了



你说了半天难道自己还不明白。即使 Java 的数据申请把 2GB 用户空间全部占用了,操作系统也不一定就会分配 2GB的物理内存给它,操作系统会自己来处理内存的swap,根本不是 Java 能控制的。

如果出现连 csrss 都没有足够内存运行,那么这个系统早就崩溃了,还谈什么解法。
0 请登录后投票
   发表时间:2012-06-19   最后修改:2012-06-19
liguocai2009 写道
cttnbcj 写道
JonathanWang 写道
cttnbcj 写道
ray_linn 写道
cttnbcj 写道
静态针对的是jdk 假如分配了100M,调用静态类不需要jdk额外增加内存,但是jdk,只是封装了console,调用的黑黑的框,除非是jdk静态类是操作桌面屏幕直接在JDK中实现的,否则肯定要去操作系统层面,内存没了,你到系统层面调用,马上卡死。


内存耗尽也是只是Java本身进程的内存耗尽好不啦,在4G的进程空间里,你申请个2G的数组,Java的内存就会耗尽,但不等于物理内存耗尽好不。

牵涉到系统调用,都是在下2G内存空间里,这部分是保留的,再怎么也耗不到这里。


明显你对操作系统实现和硬件方面的编程不了解。
基本系统是分应用和内核  一般情况: 虚拟空间2G给内核,2G给应用。但是真实内存一般:32位系统是3G多点。
内核里面内存又分可换和非可换内存空间,非可换永久在内存中,除非手动释放,换页的在不用时会到硬盘页文件中,调用时候调入内存里。
内存耗尽也是只是Java本身进程的内存耗尽好不啦   我想你应该指的是,JAVA进程本身地址空间全部被分配,不能再分配新地址空间,导致JDK不能在申请内存和变量,数组,字符等。 然后调用API到系统层面时候,内核中物理内存还有空闲的。
可看清题目机子内存基本满了,这句话指的是 真实内存基本满了





大侠,首先,32位系统的最大寻址空间是4G,这个可以自己算一下啦。估计您是受Windows毒害太深。
PS:是Win 7以前

大虾,请看清我的红色字。谢谢

处理器架构提供的部分可寻址范围由 OS 本身占用,提供给操作系统内核以及 C 运行时(对于使用 C 或者 C++ 编写的 JVM 而言)。OS 和 C 运行时占用的内存数量取决于所用的 OS,但通常数量较大:Windows 默认占用的内存是 2GB。剩余的可寻址空间(用术语来表示就是用户空间)就是可供运行的实际进程使用的内存。

 

默认情况下,32 位 Windows 拥有 2GB 用户空间和 2GB 内核空间。在一些 Windows 版本上,通过向启动配置添加 /3GB 开关并使用 /LARGEADDRESSAWARE 开关重新链接应用程序,可以将这种平衡调整为 3GB 用户空间和 1GB 内核空间。在 32 位 Linux 上,默认设置为 3GB 用户空间和 1GB 内核空间。一些 Linux 分发版提供了一个 hugemem 内核,支持 4GB 用户空间。为了实现这种配置,将进行系统调用时使用的地址空间分配给内核。通过这种方式增加用户空间会减慢系统调用,因为每次进行系统调用时,操作系统必 须在地址空间之间复制数据并重置进程地址-空间映射。

 

对于 Java 应用程序,用户空间是 Java 进程占用的内存,实际上包含两个池:Java 堆和本机(非 Java)堆。Java 堆的大小由 JVM 的 Java 堆设置控制:-Xms-Xmx 分别设置最小和最大 Java 堆。在按照最大的大小设置分配了 Java 堆之后,剩下的用户空间就是本机堆。图 1 展示了一个 32 位 Java 进程的内存布局:


图 1. 一个 32 位 Java 进程的内存布局示例
一个 32 位 Java 进程的内存布局示例视图

图 1 中,可寻址范围总共有 4GB,OS 和 C 运行时大约占用了其中的 1GB,Java 堆占用了将近 2GB,本机堆占用了其他部分。请注意,JVM 本身也要占用内存,就像 OS 内核和 C 运行时一样,而 JVM 占用的内存是本机堆的子集。

 

 

 

这个图是错的(虽然来自 IBM 社区), C Runtime不可能在系统空间里,不然在内核里我们还调用 Kprint 干嘛,直接printf 了。C runtime 在用户空间里,JVM之下。

0 请登录后投票
   发表时间:2012-06-19  
ray_linn 写道
cttnbcj 写道


明显你对操作系统实现和硬件方面的编程不了解。
基本系统是分应用和内核  一般情况: 虚拟空间2G给内核,2G给应用。但是真实内存一般:32位系统是3G多点。
内核里面内存又分可换和非可换内存空间,非可换永久在内存中,除非手动释放,换页的在不用时会到硬盘页文件中,调用时候调入内存里。
内存耗尽也是只是Java本身进程的内存耗尽好不啦   我想你应该指的是,JAVA进程本身地址空间全部被分配,不能再分配新地址空间,导致JDK不能在申请内存和变量,数组,字符等。 然后调用API到系统层面时候,内核中物理内存还有空闲的。
可看清题目机子内存基本满了,这句话指的是 真实内存基本满了



你说了半天难道自己还不明白。即使 Java 的数据申请把 2GB 用户空间全部占用了,操作系统也不一定就会分配 2GB的物理内存给它,操作系统会自己来处理内存的swap,根本不是 Java 能控制的。

如果出现连 csrss 都没有足够内存运行,那么这个系统早就崩溃了,还谈什么解法。


机子内存基本满了 csrss是没足够内存运行了。 这个是java面试题,有说过一定要用java和jdk去解它吗?
发的题目意思明显是用任何方法处理这段接近于满内存的字符串,把空格删除。 任何方法都行,都可以使裸机。当你认定用java面试题后,只能用java后,这也是只会一种语言人的通病,因为思维必定受到限制。
0 请登录后投票
   发表时间:2012-06-19  
cttnbcj 写道
ray_linn 写道
cttnbcj 写道


明显你对操作系统实现和硬件方面的编程不了解。
基本系统是分应用和内核  一般情况: 虚拟空间2G给内核,2G给应用。但是真实内存一般:32位系统是3G多点。
内核里面内存又分可换和非可换内存空间,非可换永久在内存中,除非手动释放,换页的在不用时会到硬盘页文件中,调用时候调入内存里。
内存耗尽也是只是Java本身进程的内存耗尽好不啦   我想你应该指的是,JAVA进程本身地址空间全部被分配,不能再分配新地址空间,导致JDK不能在申请内存和变量,数组,字符等。 然后调用API到系统层面时候,内核中物理内存还有空闲的。
可看清题目机子内存基本满了,这句话指的是 真实内存基本满了



你说了半天难道自己还不明白。即使 Java 的数据申请把 2GB 用户空间全部占用了,操作系统也不一定就会分配 2GB的物理内存给它,操作系统会自己来处理内存的swap,根本不是 Java 能控制的。

如果出现连 csrss 都没有足够内存运行,那么这个系统早就崩溃了,还谈什么解法。


机子内存基本满了 csrss是没足够内存运行了。 这个是java面试题,有说过一定要用java和jdk去解它吗?
发的题目意思明显是用任何方法处理这段接近于满内存的字符串,把空格删除。 任何方法都行,都可以使裸机。当你认定用java面试题后,只能用java后,这也是只会一种语言人的通病,因为思维必定受到限制。


是啊,本来是想考线性表的算法设计的。。。不知道最后怎么讨论起预言的性能和底层的东西了。。。
0 请登录后投票
   发表时间:2012-06-19   最后修改:2012-06-19
ray_linn 写道
liguocai2009 写道
cttnbcj 写道
JonathanWang 写道
cttnbcj 写道
ray_linn 写道
cttnbcj 写道
静态针对的是jdk 假如分配了100M,调用静态类不需要jdk额外增加内存,但是jdk,只是封装了console,调用的黑黑的框,除非是jdk静态类是操作桌面屏幕直接在JDK中实现的,否则肯定要去操作系统层面,内存没了,你到系统层面调用,马上卡死。


内存耗尽也是只是Java本身进程的内存耗尽好不啦,在4G的进程空间里,你申请个2G的数组,Java的内存就会耗尽,但不等于物理内存耗尽好不。

牵涉到系统调用,都是在下2G内存空间里,这部分是保留的,再怎么也耗不到这里。


明显你对操作系统实现和硬件方面的编程不了解。
基本系统是分应用和内核  一般情况: 虚拟空间2G给内核,2G给应用。但是真实内存一般:32位系统是3G多点。
内核里面内存又分可换和非可换内存空间,非可换永久在内存中,除非手动释放,换页的在不用时会到硬盘页文件中,调用时候调入内存里。
内存耗尽也是只是Java本身进程的内存耗尽好不啦   我想你应该指的是,JAVA进程本身地址空间全部被分配,不能再分配新地址空间,导致JDK不能在申请内存和变量,数组,字符等。 然后调用API到系统层面时候,内核中物理内存还有空闲的。
可看清题目机子内存基本满了,这句话指的是 真实内存基本满了





大侠,首先,32位系统的最大寻址空间是4G,这个可以自己算一下啦。估计您是受Windows毒害太深。
PS:是Win 7以前

大虾,请看清我的红色字。谢谢

处理器架构提供的部分可寻址范围由 OS 本身占用,提供给操作系统内核以及 C 运行时(对于使用 C 或者 C++ 编写的 JVM 而言)。OS 和 C 运行时占用的内存数量取决于所用的 OS,但通常数量较大:Windows 默认占用的内存是 2GB。剩余的可寻址空间(用术语来表示就是用户空间)就是可供运行的实际进程使用的内存。

 

默认情况下,32 位 Windows 拥有 2GB 用户空间和 2GB 内核空间。在一些 Windows 版本上,通过向启动配置添加 /3GB 开关并使用 /LARGEADDRESSAWARE 开关重新链接应用程序,可以将这种平衡调整为 3GB 用户空间和 1GB 内核空间。在 32 位 Linux 上,默认设置为 3GB 用户空间和 1GB 内核空间。一些 Linux 分发版提供了一个 hugemem 内核,支持 4GB 用户空间。为了实现这种配置,将进行系统调用时使用的地址空间分配给内核。通过这种方式增加用户空间会减慢系统调用,因为每次进行系统调用时,操作系统必 须在地址空间之间复制数据并重置进程地址-空间映射。

 

对于 Java 应用程序,用户空间是 Java 进程占用的内存,实际上包含两个池:Java 堆和本机(非 Java)堆。Java 堆的大小由 JVM 的 Java 堆设置控制:-Xms-Xmx 分别设置最小和最大 Java 堆。在按照最大的大小设置分配了 Java 堆之后,剩下的用户空间就是本机堆。图 1 展示了一个 32 位 Java 进程的内存布局:


图 1. 一个 32 位 Java 进程的内存布局示例
一个 32 位 Java 进程的内存布局示例视图

图 1 中,可寻址范围总共有 4GB,OS 和 C 运行时大约占用了其中的 1GB,Java 堆占用了将近 2GB,本机堆占用了其他部分。请注意,JVM 本身也要占用内存,就像 OS 内核和 C 运行时一样,而 JVM 占用的内存是本机堆的子集。

 

 

 

这个图是错的(虽然来自 IBM 社区), C Runtime不可能在系统空间里,不然在内核里我们还调用 Kprint 干嘛,直接printf 了。C runtime 在用户空间里,JVM之下。

 

 C Runtime 确实不在内核层面的。要是放内核层面,你想想把当你中断printf时候,系统早被你挂起了(进程切换时候,内核不切换,所以中断的printf,一直中断着)。要是在应用和内核分别实现的话,更加没必要的,完全浪费空间,C有些函数容易溢出,不安全。

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics