1.类加载器
启动类加载器为null,C++实现,所以为null。
双亲委派
寄存器
方法区
1.8之前叫永久代
1.8之后叫元空间
栈
类的加载:
构造代码块:
直接在类中定义且没有static修饰没有名字的 { }代码块。
构造代码块在每次创建对象时调用,构造代码块的执行次序优先于类构造函数。
/**
* @author YZC
* @date 2021/12/1 13:52
*/
public class Stu {
static {
System.out.println("static静态代码块");
}
public Stu() {
System.out.println("构造方法");
}
{
System.out.println("代码块");
}
public static void main(String[] args) {
new Stu();
System.out.println("main");
}
}
运行结果:
static静态代码块
代码块
构造方法
main
/**
* @author YZC
* @date 2021/12/1 13:52
*/
public class Stu {
static {
System.out.println("static静态代码块");
}
public Stu() {
System.out.println("构造方法");
}
{
System.out.println("代码块");
}
public static void main(String[] args) {
System.out.println("main");
new Stu();
}
}
结果:
static静态代码块
main
代码块
构造方法
/**
* @author YZC
* @date 2021/12/1 13:52
*/
public class Stu {
static {
System.out.println("static静态代码块");
}
{
System.out.println("代码块2..");
}
public Stu() {
System.out.println("构造方法");
}
{
System.out.println("代码块1");
}
public static void main(String[] args) {
new Stu();
System.out.println("===============");
new Stu();
}
}
运行结果:
static静态代码块
代码块2..
代码块1
构造方法
===============
代码块2..
代码块1
构造方法
主次分明:(主类,次类)
静态代码块、普通代码块、构造方法,在jvm中的运行?优先级,加载顺序,加载次数
静态的东西,是全局共有的,是100%注定的最优先被加载的。
1. 静态属于全局,优先级最高,但是,加载时有且仅加载一次
2. 代码块,每new一次加载一次,优先级高于构造方法
静态> 代码块》构造方法
/**
* @author YZC
* @date 2021/12/1 14:27
*/
class Code{
public Code() { //次类
System.out.println("Code构造方法");
}
{
System.out.println("Code构造块222");
}
static {
System.out.println("Code静态代码块3333");
}
}
public class CodeBlock03 { //主类
{
System.out.println("CodeBlock03 构造块444");
}
static {
System.out.println("CodeBlock03 静态代码块555");
}
public CodeBlock03() {
System.out.println("CodeBlock03 构造方法666");
}
public static void main(String[] args) {
System.out.println("分割线。。。。。。。。。。。。。。。。。");
new CodeBlock03();
}
}
运行结果:
CodeBlock03 静态代码块555
分割线。。。。。。。。。。。。。。。。。
CodeBlock03 构造块444
CodeBlock03 构造方法666
class Code {
public Code() { //次类
System.out.println("Code构造方法111");
}
{
System.out.println("Code构造块222");
}
static {
System.out.println("Code静态代码块3333");
}
}
public class CodeBlock03 { //主类
{
System.out.println("CodeBlock03 构造块444");
}
static {
System.out.println("CodeBlock03 静态代码块555");
}
public CodeBlock03() {
System.out.println("CodeBlock03 构造方法666");
}
public static void main(String[] args) {
System.out.println("分割线。。。。。。。。。。。。。。。。。");
new Code();
System.out.println("==============================");
new Code();
System.out.println("++++++++++++++++++++++++++++++");
new Code();
}
}
结果:
CodeBlock03 静态代码块555
分割线。。。。。。。。。。。。。。。。。
Code静态代码块3333
Code构造块222
Code构造方法111
==============================
Code构造块222
Code构造方法111
++++++++++++++++++++++++++++++
Code构造块222
Code构造方法111
堆
方法区
堆内存调优
注意区分monitorGC。。。。
判断对象是否垃圾?
2个:
1.引用计数
2.GCRoots根可达算法
1.复制算法
2.标记算法
优点:
节约空间。
缺点:
3.标记压缩
优点:
无浪费空间,无碎片产生
缺点:
耗时