Java基础篇——JVM初步
1.JVM的位置
2.JVM体系结构
3.类加载器
- 虚拟机加载器(java)
- 启动类(根)加载器(C++)
- 扩展类加载器(java)↑
- 应用程序加载器(java)↑
4.双亲委派机制
类加载器收到类加载请求时,加载器会先在上层加载器中寻找同名类,上层加载器也会委托给上上层加载器寻找,以此委托到顶层(启动)加载器,称之为双亲委派,越上层的类加载优先级越高,如果已经加载了一个类,则所有低于该优先级的同名类都不会被加载
5.沙箱安全机制
SandBox时java安全模型的核心,Jdk1.6引用了系统域的概念,为代码分配权限,权限越低的代码访问限制越多
沙箱的基本组件:
- 字节码校验器
- 类装载器
- 存取控制器(对操作系统的存取权限)
- 安全管理器(和操作系统间的接口)
- 安全软件包
6.Native
调用底层C语言库(jni)的说明,被Native声明的方法会进入本地方法栈
7.方法区
被所有线程共享,类信息、静态变量、常量池(常量、String)等都存在于方法区中(jdk1.7之后,常量池存放在堆中)
8.栈区
主管程序运行、生命周期和线程同步,一旦生命周期结束就会弹出,所以栈内不存在垃圾回收
9.三种JVM
- Sun公司 HotSpot
- BEA公司 JRockit
- IBM公司 J9VM
10.堆
一个JVM只有一个堆,并且大小可调节
堆内存中分有三个区域
- 新生区 Young/New
- 伊甸园区
- 幸存区0
- 幸存区1
- 养老区 Old
- 永久区 Perm(JDK1.8之后改为元空间,元空间物理上不在JVM堆内存中,而在计算机内存中,方法区便在其中)
一般来说,系统分配给JVM的内存是当前内存的1/4(MAX_Memery),jvm初始化的内存是1/64(Total_Memery)
堆内存调优:-XmsTotal_Memery -XmxMAX_Memery -XX: Other
使用JProfiler分析OOM原因
VM参数:-Xms1m -Xmx1m -XX:+HeapDumpOnOutOfMemoryError
(设置了小内存,节省时间,XX参数表示在出现OOM错误时生成一个Dump文件)
11.GC
重gc(fullGC)和轻gc(minorGC)
判断对象是否存活
引用计数法
每个对象在创建的时候,就给这个对象绑定一个计数器。每当有一个引用指向该对象时,计数器加一;每当有一个指向它的引用被删除时,计数器减一。这样,当没有引用指向该对象时,该对象死亡,计数器为0,这时就应该对这个对象进行垃圾回收操作。
根搜索方法
根搜索方法是通过一些GCRoots对象(包括:栈中引用的对象、方法区中的静态常量、本地方法栈中的jni引用对象)作为起点,从这些节点开始往下搜索,搜索通过的路径成为引用链(ReferenceChain),当一个对象没有被GCRoots的引用链连接的时候,说明这个对象是不可用的。
gc四大算法
标记——清除法(老年代)
第一次扫描标记存活的对象
第二次扫描清除未标记的对象
优点:不产生额外的空闲内存
缺点:产生大量内存碎片、扫描两次浪费时间
标记整理算法(老年代)
针对标记清除算法的大量内存碎片,该算法对其做了升级,对二次扫描清除几次后的内存空间再次扫描,将剩余存活对象挪到同一端,称为标记清除压缩(整理)算法,但是会额外增加扫描时间
复制算法(新生区)
幸存to区和幸存from区的不断复制转换,空的区被称为to区,便于下次接收从伊甸园区的幸存对象和from区的幸存对象
优点:没有内存碎片
缺点:多余出了一个to区造成内存空闲、浪费
适用情况:对象生存时间较短(比如新生代)
分代收集法
对前三种方法的综合使用,也是目前商业jvm最常用的垃圾回收算法,它根据对象存活周期的不同将内存划分为几块,一般是把Java堆分为新生代和老年代,然后根据各个年代的特点采用最适当的垃圾收集算法。
在新生代中,每次垃圾收集都发现有大批对象死去,只有少量存活,就选用复制算法,而老年代因为对象存活率高,没有额外空间对它进行分配担保,就必须使用标记清除或者标记压缩算法来进行回收。
最新文章
- [LeetCode] Sqrt(x) 求平方根
- freemarker种种
- Google调用explorer.exe打开本地文件
- Spring 4 官方文档学习(十五)CORS支持
- ACdream 1224 Robbers (贪心)
- android学习记录(十三)Task 和 Activity 回退栈操作。
- FastDFS配置过程
- TopCoder SRM 625 Incrementing Sequence 题解
- 把记事本文件固定在Win8的开始屏幕
- python自学1——代码优化1
- CSS基础知识(颜色、伪类、盒子模型)
- Python学习一:基础语法
- SharePoint 2007 列表页定制--4个默认页定制
- APP界面设计与页面布局的23条基本原则
- linux deb系 rpm系 配置路由
- Python中xlrd和xlwt模块使用方法
- Subversion客户端接受服务器证书出现“The certificate hostname does not match”的问题
- 用 javascript 实现 ping 一个主机,仅测试是否能够连接。
- update-alternatives常用命令(转自http://blog.csdn.net/baggio1006/article/details/6338623)
- kafka浅谈
热门文章
- 【算法训练营day7】LeetCode454. 四数相加II LeetCode383. 赎金信 LeetCode15. 三数之和 LeetCode18. 四数之和
- Mysql 用户远程登录数据库
- 实战进阶 Vue3+Axios+pinia
- 永久解决Ubuntu下adb权限问题
- ValidList
- <;四>;构造函数初始化列表
- 一个jsqlparse+git做的小工具帮我节省时间摸鱼
- Training: WWW-Robots
- IDEA把项目推送到Gitee
- Codeforces Round #836 (Div. 2) A-D