锁定老帖子 主题:一个java面试题
精华帖 (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(); } } |
|
返回顶楼 | |
发表时间: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到系统层面时候,内核中物理内存还有空闲的。 可看清题目机子内存基本满了,这句话指的是 真实内存基本满了 |
|
返回顶楼 | |
发表时间: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以前 |
|
返回顶楼 | |
发表时间: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以前 大虾,请看清我的红色字。谢谢 |
|
返回顶楼 | |
发表时间: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 版本上,通过向启动配置添加
对于 Java 应用程序,用户空间是 Java 进程占用的内存,实际上包含两个池:Java 堆和本机(非 Java)堆。Java 堆的大小由 JVM 的 Java 堆设置控制: 在 图 1 中,可寻址范围总共有 4GB,OS 和 C 运行时大约占用了其中的 1GB,Java 堆占用了将近 2GB,本机堆占用了其他部分。请注意,JVM 本身也要占用内存,就像 OS 内核和 C 运行时一样,而 JVM 占用的内存是本机堆的子集。
|
|
返回顶楼 | |
发表时间:2012-06-19
cttnbcj 写道 明显你对操作系统实现和硬件方面的编程不了解。 基本系统是分应用和内核 一般情况: 虚拟空间2G给内核,2G给应用。但是真实内存一般:32位系统是3G多点。 内核里面内存又分可换和非可换内存空间,非可换永久在内存中,除非手动释放,换页的在不用时会到硬盘页文件中,调用时候调入内存里。 内存耗尽也是只是Java本身进程的内存耗尽好不啦 我想你应该指的是,JAVA进程本身地址空间全部被分配,不能再分配新地址空间,导致JDK不能在申请内存和变量,数组,字符等。 然后调用API到系统层面时候,内核中物理内存还有空闲的。 可看清题目机子内存基本满了,这句话指的是 真实内存基本满了 你说了半天难道自己还不明白。即使 Java 的数据申请把 2GB 用户空间全部占用了,操作系统也不一定就会分配 2GB的物理内存给它,操作系统会自己来处理内存的swap,根本不是 Java 能控制的。 如果出现连 csrss 都没有足够内存运行,那么这个系统早就崩溃了,还谈什么解法。 |
|
返回顶楼 | |
发表时间: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 版本上,通过向启动配置添加
对于 Java 应用程序,用户空间是 Java 进程占用的内存,实际上包含两个池:Java 堆和本机(非 Java)堆。Java 堆的大小由 JVM 的 Java 堆设置控制: 在 图 1 中,可寻址范围总共有 4GB,OS 和 C 运行时大约占用了其中的 1GB,Java 堆占用了将近 2GB,本机堆占用了其他部分。请注意,JVM 本身也要占用内存,就像 OS 内核和 C 运行时一样,而 JVM 占用的内存是本机堆的子集。
这个图是错的(虽然来自 IBM 社区), C Runtime不可能在系统空间里,不然在内核里我们还调用 Kprint 干嘛,直接printf 了。C runtime 在用户空间里,JVM之下。 |
|
返回顶楼 | |
发表时间: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后,这也是只会一种语言人的通病,因为思维必定受到限制。 |
|
返回顶楼 | |
发表时间: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后,这也是只会一种语言人的通病,因为思维必定受到限制。 是啊,本来是想考线性表的算法设计的。。。不知道最后怎么讨论起预言的性能和底层的东西了。。。 ![]() |
|
返回顶楼 | |
发表时间: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 版本上,通过向启动配置添加
对于 Java 应用程序,用户空间是 Java 进程占用的内存,实际上包含两个池:Java 堆和本机(非 Java)堆。Java 堆的大小由 JVM 的 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有些函数容易溢出,不安全。 |
|
返回顶楼 | |