jvm内存的分配?
回答:1.程序计数器:线程私有,当前线程执行的字节码的行号指示器。
2.虚拟机栈:线程私有,存放基本数据类型、对象引用和returnAddress类型。
3.本地方法栈:为虚拟机使用到的Native方法服务。
4.Java堆:线程共享,存放对象的实例,也是GC回收器管理的主要区域。
5.方法区:线程共享,存放已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。
6.运行时常量池:方法区的一部分,存放编译期生成的各种字面量和符号引用。
7.直接内存:不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域,容易引起OOM异常,NIO会调用,不受Java堆大小的限制。
有没有遇到过内存溢出,内存溢出怎么解决?
回答: 分不同情况解决,大多数情况下,此时如果代码没有问题的情况下,适当调整-Xmx和-Xms是可以避免的,不过一定是代码没有问题的前提,为什么会溢出呢,要么代码有问题,要么访问量太多并且每个访问的时间太长或者数据太多,导致数据释放不掉,因为垃圾回收器是要找到那些是垃圾才能回收,这里它不会认为这些东西是垃圾,自然不会去回收了。
jvm调优有哪几种方式
回答:1.观察内存释放情况、集合类检查、对象树
2.线程监控
3.内存泄漏检查
gc回收机制原理?
回答:用户Java程序运行过程中,Java虚拟机提供了另外一个系统级的线程,专门负责回收不再被使用的对象占用的内存,这一过程称为垃圾回收。垃圾回收需要对堆内存中的对象进行标记,并对堆内存进行整理。这一过程的某些阶段需要暂时终止用户Java线程,等回收工作完成后再恢复执行。因此,频繁地触发虚拟机垃圾回收操作的行为会影响程序的运行效率。那么什么情况下会频繁地出发垃圾回收操作呢?- 比如:堆内存设置过小- 再比如:程序频繁地分配大型局部对象数组。