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堆分为新生代和老年代,然后根据各个年代的特点采用最适当的垃圾收集算法。
在新生代中,每次垃圾收集都发现有大批对象死去,只有少量存活,就选用复制算法,而老年代因为对象存活率高,没有额外空间对它进行分配担保,就必须使用标记清除或者标记压缩算法来进行回收。
Java基础篇——JVM初步的更多相关文章
- Java基础篇(JVM)——类加载机制
这是Java基础篇(JVM)的第二篇文章,紧接着上一篇字节码详解,这篇我们来详解Java的类加载机制,也就是如何把字节码代表的类信息加载进入内存中. 我们知道,不管是根据类新建对象,还是直接使用类变量 ...
- Java基础篇(JVM)——字节码详解
这是Java基础篇(JVM)的第一篇文章,本来想先说说Java类加载机制的,后来想想,JVM的作用是加载编译器编译好的字节码,并解释成机器码,那么首先应该了解字节码,然后再谈加载字节码的类加载机制似乎 ...
- Java基础篇——JVM之GC原理(干货满满)
原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10697554.html ,多多支持哈! 一.什么是GC? GC是垃圾收集的意思,内存处理是 ...
- Java基础篇 - 强引用、弱引用、软引用和虚引用
Java基础篇 - 强引用.弱引用.软引用和虚引用 原创零壹技术栈 最后发布于2018-09-09 08:58:21 阅读数 4936 收藏展开前言Java执行GC判断对象是否存活有两种方式其中一种是 ...
- 小白—职场之Java基础篇
java基础篇 java基础 目录 1.java是一种什么语言,jdk,jre,jvm三者的区别 2.java 1.5之后的三大版本 3.java跨平台及其原理 4.java 语言的特点 5.什么是字 ...
- java基础篇---I/O技术
java基础篇---I/O技术 对于任何程序设计语言而言,输入输出(I/O)系统都是比较复杂的而且还是比较核心的.在java.io.包中提供了相关的API. java中流的概念划分 流的方向: 输 ...
- 金三银四跳槽季,BAT美团滴滴java面试大纲(带答案版)之一:Java基础篇
Java基础篇: 题记:本系列文章,会尽量模拟面试现场对话情景, 用口语而非书面语 ,采用问答形式来展现.另外每一个问题都附上“延伸”,这部分内容是帮助小伙伴们更深的理解一些底层细节的补充,在面试中可 ...
- Java基础-考察JVM内部结构的常用工具介绍
Java基础-考察JVM内部结构的常用工具介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们可以通过jvisualvm.exe考察jvm内部结构.而jvisualvm.exe ...
- java基础篇---HTTP协议
java基础篇---HTTP协议 HTTP协议一直是自己的薄弱点,也没抽太多时间去看这方面的内容,今天兴致来了就在网上搜了下关于http协议,发现有园友写了一篇非常好的博文,博文地址:(http: ...
- java基础篇---I/O技术(三)
接上一篇java基础篇---I/O技术(二) Java对象的序列化和反序列化 什么叫对象的序列化和反序列化 要想完成对象的输入或输出,还必须依靠对象输出流(ObjectOutputStream)和对象 ...
随机推荐
- aws上传文件、删除文件、图像识别
目录 aws的上传.删除s3文件以及图像识别文字功能 准备工作 安装aws cli 初始化配置AWS CLI s3存储桶开通 图像识别文字功能开通 aws的sdk 上传文件 方法一 方法二 删除文件 ...
- 齐博x1关于小程序个性源代码的说明
系统默认推荐商家小程序使用通用型的源码,即框架套壳iframe形式的.这个灵活性更高.但如果有特殊需求的话,也可以设置个性源码,比如配合uni-app使用,针对不同的小程序就使用不同的uni-app风 ...
- 齐博x1直播要设置回调地址才能播放
因为通过扫码或推流网址给第三方用,也能让圈子实现直播,所以系统就改为必须要设置回调地址才能播放视频了.下面阿里与腾讯的都是大同小异的.腾迅的有多项,阿里的只有一项,不过阿里其实还有另一项,就是录制的时 ...
- "一键重装系统软件"操作流程
博主之前重装系统都是直接用win10系统更新里的重置系统(版本不会变化),和U盘重装电脑出厂映像(有各种品牌自带的软件,而且由于是出场版本,版本很低) 所以这次用"小白一键重装系统" ...
- kubernetes VS OpenShift浅析
Kubernetes vs OpenShift浅析 古语有云:"知彼知己,百战不殆.不知彼而知己,一胜一负.不知彼,不知己,每战必殆." 这句话同样也适用于技术体系.无论我们在落地 ...
- Spring Boot 项目自定义 banner
前言 我们在启动 Spring Boot 项目时,控制台会打印出 Spring Boot 专属的标语,也称 banner(横幅标语/广告),效果如下: 实际上,上面这个 banner,我们可以自定义, ...
- 开源项目在线化 中文繁简体转换/敏感词/拼音/分词/汉字相似度/markdown 目录
前言 以前在 github 上自己开源了一些项目.碍于技术与精力,大部分项目都是 java 实现的. 这对于非 java 开发者而言很不友好,对于不会编程的用户更加不友好. 为了让更多的人可以使用到这 ...
- CSP-J/S 2021 游记
\(\large\texttt{Day -1}\) 晚上好累啊,去集训了,回来之后发现十一点了还码了一会儿,只能祈求上帝明天不会打瞌睡. \(\large\texttt{Day 0}\) 意料中的事情 ...
- Rust Aya 编写 eBPF 程序
本文地址:https://www.ebpf.top/post/ebpf_rust_aya 1. 前言 Linux 内核 6.1 版本中有一个非常引人注意的变化:引入了对 Rust 编程语言的支持.Ru ...
- 【JAVA】详解在JAVA中int与Integer的区别以及背后的原因。
区别 首先我们要明确,这两点之间有什么区别? 主要有以下几点: 数据类型不同:int是基础数据类型,而 Integer是包装数据类型: 默认值不同:int的默认值是 0,而 Integer的默认值是 ...