零碎知识点
-
JDK>jre>jvm(包含)
-
jvm使用c语言写的
-
java也叫C+±-?
java去掉了C++繁琐的东西,指针,内存管理
-
栈内不可能会有垃圾回收。为什么?
-
所以jvm调优99%的情况都是在调方法区和堆区
-
类是模板,是抽象的;对象是具体的
一. 类加载器???
先空着
二. 双亲委派机制
https://blog.csdn.net/codeyanbao/article/details/82875064
-
为什么在一直往上查询类加载器时,到启动类加载器就显示为null?
再往上就是C++代码的实现,无法查看
-
.java–>.class–>类加载器---->jvm(C写的)
-
类装载器采用的机制是双亲委派模式。
三. 沙箱安全机制
- (59条消息) java中的安全模型(沙箱机制)_改变ing-CSDN博客_沙箱安全机制
- https://blog.csdn.net/qq_41813208/article/details/108091557
四. native关键字,PC寄存器,方法区
1. native
(1)凡是带了native关键字的,说明java的作用范达不到了,会去调用底层C语言的库。
(3)JNI作用:扩展Java的使用,融合不同的编程语言为Java所用!在Java诞生的时候,C/C++横行,想要立足,必须要有调用C/C++的 程序。
(5)什么情况下调用native:操作硬件的情况等,如驱动打印机,管理系统(这个是什么~~)等
2. PC寄存器
程序计数器(第一次听,以后用到在搜吧)
3. 方法区
静态static变零,常量,类信息(构造方法,接口定义),运行时的常量池存在方法区中,但是实例变量存放在堆内存中,和方法区无关。
五. 栈
1. 栈帧
https://blog.csdn.net/ylyuanlu/article/details/18947951
https://blog.csdn.net/qian520ao/article/details/79118474
https://blog.csdn.net/heihaozi/article/details/103830143
(1)栈帧就是压栈的那个
(3)程序正在执行的方法,一定处于栈的顶部
2. 栈,堆,方法区的交互关系
(1)三块区域,方法区存在常量池
也就是说:对象实例化的过程是什么?
没找到相应文章
六. 堆
-
三种jvm
(1)HotSpot(Sun公司)
(2)JRockit
(3)j9vm
-
堆内存中还要细分为三个区域:
●新生区(伊甸园区) Young/New
●养老区old
●永久区Perm
(2)GC垃圾回收,主要是在伊甸园区和养老区
(3)假设内存满了,OOM,堆内存不够! java.lang.OutOfMemoryError:Java heap space
(5)在JDK8以后,永久存储区改了个名字(元空间)
5. 新生区、老年区
重GC和轻GC:伊甸园满了就触发轻GC,经过轻GC存活下来的就到了幸存者区,幸存者区满之后意味着新生区也满了,则触发重GC,经过重GC之后存活下来的就到了养老区。真理:经过研究,99%的对象都是临时对象
6. 永久区
(1)堆满,报错OOM,如何解决?
1)手动配置类的参数,扩大堆的内存空间。
2)倘若还报错,说明程序有误。可能有什么死循环代码,垃圾代码等。
(2)逻辑上存在,物理上不存在(通过计算,元空间没分配内存)
(3)常用的配置参数含义:
1)-xms 设置初始化内存分配大小 默认cpu的1/64
2)-Xmx 设置最大分配内存,默认1/4
3)-XX:+PrintGCDetails //打印GC垃圾回收信息
4)-XX:+HeapDumpOnOutOfMemoryError //oom DUMP 打印堆内存溢出信息
- JPofiler工具:内存快照分析工具
七. GC算法
-
引用计数法(不中用)
-
复制算法???
请看狂神的笔记https://blog.csdn.net/qq_40126686/article/details/108279919
八. JMM
???jvm都问烂了,现在很多问这个