JVM
Posted xxc-blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM相关的知识,希望对你有一定的参考价值。
1.内存模型以及分区。
内存模型主要由方法区、堆、栈、本地方法栈、程序计数器。
方法区:供各线程共享的运行时的内存区域。存储了类信息,运行时常量池等,还存放static变量。
堆:通过new关键字,创建对象都会使用到堆内存。存放所有new出来的对象,只保存对象本身,不保存对象的引用。
栈:程序运行时的内存空间。主要由栈帧结构组成,调用一个方法即压入一个栈帧。是线程私有的,因此不存在垃圾回收机制。8种基本数据类型、对象的引用与实例方法都保存在栈内存中。
本地方法栈:主要是native方法。
程序计数器:记录当前线程jvm指令的执行地址。线程私有,不存在垃圾回收机制。
2.一个java程序的执行流程。
java文件,编译器生成字节码class文件,然后经过类加载器、字节码校验器与解释器到操作系统平台。
3.JVM如何判断一个对象能否被GC,可以被视为root的都有哪几种类型?
- 引用计数法。即当对象被引用一次就+1,如果失效了就-1,变成了0之后就可以判断可以被垃圾回收。但JVM并没有采用这种方式,因为不能很好的解决循环利用。比如A与B互相引用,但程序已经没有再引用A和B了。
- 引用链法。通过一种GC ROOT对象来进行判断,GC ROOT代表那种不能够删除的对象。如果对象有一条链能够到达该GC ROOT则判断该对象不能进行回收,反之则可以回收。
可以作为GC ROOT的对象:
- System Class:由系统类加载器(System Class Loader)加载的类。自定义类加载器加载的类不一定是 GC ROOT对象。
- Thread:激活状态的线程
- Stack Local: Java方法的local变量或参数(存在于所有Java线程当前活跃的栈帧里,它们会指向堆里的对象)
- JNI Local:JNI方法的local变量或参数。JNI是Java Native Interface的缩写,中文为JAVA本地调用。
- JNI Global - 全局JNI引用
- 正在被用于同步的各种锁对象
- JVM自身存有的对象,比如类加载器等。
4.强软弱虚引用的区别以及GC对他们执行怎样的操作?
强引用:在程序中普遍存在,一般为直接引用。永远都不会对其进行垃圾回收。
Object object = new Object(); String str = "hello";
软引用:用来描述一些还有用但非必须的对象。内存不足时会对其进行回收。
弱引用:用来描述非必须对象。会被垃圾回收。
虚引用:虚引用的存在不会对对象的生存时间构成任何影响,为一个对象设置虚引用的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。
以上是关于JVM的主要内容,如果未能解决你的问题,请参考以下文章