前言
请在看这篇文章之前先看
https://blog.youkuaiyun.com/dtttyc/article/details/89005771
JVM性能调优
使用什么工具?
Jconsole查看
-Xmx Heap最大
-Xms 初始
-Xmn young区大小
-Xss 每个线程Stack大小
-XX:PermSize 非堆内存初始化大小
-XX:MaxPermSize 最大非堆内存大小
对象什么时候可以回收
- 引用计数器,如果有引用加1, 引用消失减一
引发问题,加一容易,减一不容易,.找到对象不容易
- java虚拟机中的栈作为搜索,可以了解一下Gc Roots,当没有再关联引用那么就是可以回收的
为什么 会有新生代和老年代
为了高效.根据对象的存活时间划分,避免全局扫描
对象空间到持久层(方法区)
a1.m1()
- 在栈中找到引用堆的对象
- 在堆中根据对象类型指针找到持久层方法中的classA结构
- 找到具体方法,让cpu执行
- 执行的时候栈会存储临时变量和局部变量分配内存, 当方法执行的时候栈也在改变
抽象
对过程抽象
对数据抽象
用类去封装数据和过程
class ABC{
//属性(数据)
//方法(过程,操作,行为)
}
继承
扩展,代码重用.正是有了继承才有了面向对象的第三大特性多态
复用不单单是在继承有, 我再A中new出b对象,依旧可以访问b对象里面的内容
多态
一个对象多种形态,由于继承而产生了多态
1人中一形态, 人是动物的一种形式, 人是生物的一种形态, 人是物体的一种形态, 为什么呢?
是因为他们都继承了动物,生活,物体.这也就是 继承产生了多态
Animal a = new Bird()
主观认为 客观存在, 从不同观察角度看会运行不同的类
编译时类型 运行时类型 不同的运行时期
a.sing() 编译错误, 编译不让通过, 因为Bird是运行时存在的
我们把子类对象当做父类对象来看, 那么就只能访问父类中有定义的熟悉和方法
在编译器的时候我们可以让他绕过,也就是说不会报错, 但是对于jvm来说是不会被欺骗也就是根据不同角度运行不同的类
构造函数
1任何类都有构造函数,如果没有明确的定义,则系统会默认加上构造函数
2 任何一个类的构造函数第一行只能是
this(XXX) or super (XXX)
如果不明确声明,系统默认加上调用super()
接口
1弥补单继承缺点
2形成一个体系