JVM内存
jvm内存内存模型
栈和堆的区别
为什么要用堆和栈,而不直接全放一起
内存溢出和内存泄漏的定义
- 内存溢出:程序申请内存时,没有足够内存控件则报OOM
- 内存泄露:程序申请内存后无法释放,最终导致内存耗尽
堆内存不够了会怎么样 该怎么办
- JVM有一个堆(作为运行时数据区在JVM启动时创建),JVM中除了堆外的内存叫非堆内存(JVM自使用);堆初始化大小由-Xms指定默认物理内存1/64;JVM堆最大内存由-Xmx指定,默认是物理内存1/4;一般设置两个参数一样避免程序允许过程中动态向os申请内存以及每次GC后调整堆大小
- 堆内存不够时,则配置JVM的-Xmx参数,比如配置为1024m
new一个对象的具体过程,调用一个成员的内存具体过程
类加载机制/类加载步骤
双亲委派模型/自实现一个java.lang.String类,怎么进行加载的,怎么跟原来的类进行区分的
- 当一个类加载器收到类加载的请求,它将这个加载请求委派给父类加载器进行加载,每一层加载器都是如此,最终,所有的请求都会传送到启动类加载器中。只有当父类加载器自己无法完成加载请求时,子类加载器才会尝试自己加载;可以保证所有Java类库都是由启动类加载器实现的
- 用户编写java.lang.Object,加载请求传递到启动类加载器,启动类加载的是系统中Object对象自定义的不会被加载;这类存在于Java类库中的类都是不会被加载的,正是由于这种双亲委派机制保证了沙箱安全,Java源码不被污染
GC
什么是GC
- 垃圾回收,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的
- GC可以有效防止内存泄露,
GC中哪些对象可以回收
- 引用计数法,无法解决对象循环引用问题,引用计数为0会被回收
- GC Roots搜索,判断不可达后还需要经历两次标记过程才会被回收
可作为GC Root根节点的对象有哪些
- 栈帧中本地变量表引用的对象
- 本地方法栈中JNI引用对象
- 方法区类静态属性引用对象
- 方法区常量引用对象
GC触发时机
- Minor GC :新对象生成申请eden区空间失败触发堆Young区的GC
- FullGC:整个堆的GC
- 老年代满
- 方法区满
- 上一次GC后堆的各域分配策略动态变化
- system.gc被显式调用