Java虚拟机面试题

 GC垃圾回收,当你内存溢出时,使用回收垃圾时,你的对象真正使用你如何处理,
JVM装载class文件的机制 
内存溢出问题 
对JVM有多少的了解,如果出现内存溢出的时候,我要怎么办(申请虚拟内存)? 
你在项目中用反射了吗?反射是怎么实现的? 
堆与栈的区别? 
垃圾回收(gc)干什么的?
内存溢出是什么? 
classload怎么加载class 
class.forname的好处   
类的加载过程,顺序 
内存溢出怎么解决 
Java代码里怎么提高系统性能. 。
GC 是什么? 为什么要有 GC? 
怎么加大JDK的虚拟内存 
classLoader以及实现机制 
还有反射的原理 
什么放在堆里什么放在栈里 
GC哪么实现的, 
new出来的对象是放在堆里还是栈里? 

 

问:堆和栈有什么区别堆和栈有什么区别有什么
答:堆是存放对象的,但是对象内的临时变量是存在栈内存中,如例子中的 methodVar 是在运
行期存放到栈中的。
栈是跟随线程的,有线程就有栈,堆是跟随 JVM 的,有 JVM 就有堆内存。


问:堆内存中到底存在着什么东西?堆内存中到底存在着什么东西?
答:对象,包括对象变量以及对象方法。


问:类变量和实例变量有什么区别?类变量和实例变量有什么区别?有什么区别
答:静态变量是类变量,非静态变量是实例变量,直白的说,有 static 修饰的变量是静态变量,
没有 static 修饰的变量是实例变量。静态变量存在方法区中,实例变量存在堆内存中。
     启动时就初始化好的,和你这说的不同呀!


问:我听说类变量是在 JVM 启动时就初始化好的,和你这说的不同呀!
答:那你是道听途说,信我的,没错。
     的方法(函数)到底是传值还是传址值还是传址?


问:Java 的方法(函数)到底是传值还是传址?
答:都不是,是以传值的方式传递地址,具体的说原生数据类型传递的值,引用类型传递的地
址。对于原始数据类型,JVM 的处理方法是从 Method Area 或 Heap 中拷贝到 Stack,然后运行 frame
中的方法,运行完毕后再把变量指拷贝回去。
             产生?


问:为什么会产生 OutOfMemory 产生?
答:一句话:Heap 内存中没有足够的可用内存了。这句话要好好理解,不是说 Heap 没有内存
了,是说新申请内存的对象大于 Heap 空闲内存,比如现在 Heap 还空闲 1M,但是新申请的内存需
要 1.1M,于是就会报 OutOfMemory 了,可能以后的对象申请的内存都只要 0.9M,于是就只出现
一次 OutOfMemory,GC 也正常了,看起来像偶发事件,就是这么回事。 但如果此时 GC 没有回
收就会产生挂起情况,系统不响应了。


问:我产生的对象不多呀,为什么还会产生 OutOfMemory?我产生的对象不多呀,?
答:你继承层次忒多了,Heap 中 产生的对象是先产生 父类,然后才产生子类,明白不?
            错误分几种?问:OutOfMemory 错误分几种?
答:分两种,分别是“OutOfMemoryError:java heap size”和”OutOfMemoryError: PermGen
space”,两种都是内存溢出,heap size 是说申请不到新的内存了,这个很常见,检查应用或调整
堆内存大小。
“PermGen space”是因为永久存储区满了,这个也很常见,一般在热发布的环境中出现,是
因为每次发布应用系统都不重启,久而久之永久存储区中的死对象太多导致新对象无法申请内存,
一般重新启动一下即可。


问:为什么会产生 StackOverflowError??
答:因为一个线程把 Stack 内存全部耗尽了,一般是递归函数造成的。
         之间可以互访吗?


问:一个机器上可以看多个 JVM 吗?JVM 之间可以互访吗?
答:可以多个 JVM,只要机器承受得了。JVM 之间是不可以互访,你不能在 A-JVM 中访问
B-JVM 的 Heap 内存,这是不可能的。在以前老版本的 JVM 中,会出现 A-JVM Crack 后影响到
B-JVM,现在版本非常少见。
      要采用垃圾回收机制,的显式


问:为什么 Java 要采用垃圾回收机制,而不采用 C/C++的显式内存管理?的显 内存管理?
答:为了简单,内存管理不是每个程序员都能折腾好的。


问:为什么你没有详细介绍垃圾回收机制?为什么你没有详细介绍垃圾回收机制
答:垃圾回收机制每个 JVM 都不同,JVM Specification 只是定义了要自动释放内存,也就是
说它只定义了垃圾回收的抽象方法,具体怎么实现各个厂商都不同,算法各异,这东西实在没必要
深入。
    中到底哪些区域是共享的?哪些是私有的?


问:JVM 中到底哪些区域是共享的?哪些是私有的?
答:Heap 和 Method Area 是共享的,其他都是私有的,


问:什么是 JIT,你怎么没说?,你怎么没说?
答:JIT 是指 Just In Time,有的文档把 JIT 作为 JVM 的一个部件来介绍,有的是作为执行引
擎的一部分来介绍,这都能理解。Java 刚诞生的时候是一个解释性语言,别嘘,即使编译成了字
节码(byte code)也是针对 JVM 的,它需要再次翻译成原生代码(native code)才能被机器执行,于
是效率的担忧就提出来了。Sun 为了解决该问题提出了一套新的机制,好,你想编译成原生代码,
没问题,我在 JVM 上提供一个工具,把字节码编译成原生码,下次你来访问的时候直接访问原生
码就成了,于是 JIT 就诞生了,就这么回事。
    还有哪些部分是你没有提到的?


问:JVM 还有哪些部分是你没有提到的?
答:JVM 是一个异常复杂的东西,写一本砖头书都不为过,还有几个要说明的:
常量池(constant pool)按照顺序存放程序中的常量,:并且进行索引编号的区域。比如 int i =100,
这个 100 就放在常量池中。
安全管理器(Security Manager):提供 Java 运行期的安全控制,防止恶意攻击,比如指定读取
文件,写入文件权限,网络访问,创建进程等等,Class Loader 在 Security Manager 认证通过后才
能加载 class 文件的。
方法索引表(Methods table),记录的是每个 method 的地址信息,Stack 和 Heap 中的地址指针
其实是指向 Methods table 地址。


问:为什么不建议在程序中显式的生命 System.gc()??
答:因为显式声明是做堆内存全扫描,也就是 Full GC,是需要停止所有的活动的(Stop The
World Collection),你的应用能承受这个吗?


问:JVM 有哪些调整参数?
答:非常多,自己去找,堆内存、栈内存的大小都可以定义,甚至是堆内存的三个部分、新生
代的各个比例都能调整。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值