一、简介
首先,我们要知道JVM中的垃圾是指什么:
在 JVM 的眼中,垃圾就是指那些在堆中存在的,已经“死亡”的对象。JVM进行垃圾回收之前,首先要判断哪些对象是垃圾(可销毁,占用内存可被回收)。
在 Java体系中,几乎所有的对象实例都在堆中存放,所以垃圾回收也主要是针对堆来进行的。
在JAVA体系中,垃圾回收机制指的就是对象的内存回收机制(回收目标、回收策略),这种回收是不需要程序员主动操作的,由虚拟机在后台完成。
首先,我们要知道JVM中的垃圾是指什么:
在 JVM 的眼中,垃圾就是指那些在堆中存在的,已经“死亡”的对象。JVM进行垃圾回收之前,首先要判断哪些对象是垃圾(可销毁,占用内存可被回收)。
在 Java体系中,几乎所有的对象实例都在堆中存放,所以垃圾回收也主要是针对堆来进行的。
在JAVA体系中,垃圾回收机制指的就是对象的内存回收机制(回收目标、回收策略),这种回收是不需要程序员主动操作的,由虚拟机在后台完成。
JVM提供的参数非常多,熟悉常用JVM参数能够帮助我们更好的进行调优
本篇文章将总结JVM参数的分类,以及GC日志、运行时内存区、OOM、垃圾收集器相关的常用参数。
这里以new关键字来创建对象。
在虚拟机的常量池区域定位对应类的符号引用。
判断这个符号引用代表的类是否被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。
在堆中分配对象内存,内存的大小在类加载后便已完全确定。分配方式有两种:指针碰撞、空闲列表。具体采用哪一种取决于堆内存是否规整。
关于分配时的并发安全:虚拟机采用CAS+失败重试的方式保证并发分配内存,如果开启了TLAB参数(本地线程分配缓冲区),则哪个线程要分配内存,就在哪个线程的TLAB上进行分配,只有当TLAB区域用完时,才对堆内存进行同步锁定。
内存分配完成后,对分配到的内存空间进行初始化(例如相关数据类型的默认值),然后对对象头中的描述信息进行必要的设置(例如对象的哈希码、GC分代年龄、类的元数据信息等等)。
在上面的工作都完成后,从虚拟机的视角来看,一个新对象已经产生了,但站在JAVA程序的角度,对象创建才刚刚开始,接下来需要把对象按照程序员的意愿进行初始化(比如执行一些构造方法,init方法等等),这样一个真正可用的对象才算完全产生出来。
JVM(Java Virtual Machine,Java虚拟机),是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机平台(操作系统)上仿真模拟各种计算机功能来实现的。引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。
Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码class文件),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java能够“一次编译,到处运行”的原因。