JVM初探究【JVM入门教程】
JVM初探究
- 谈谈你对JVM理解?Java8虚拟机和之前的变化更新
- 什么是OOM,什么是栈溢出?怎么分析
- JVM的常用调优参数有哪些?
- 内存快照如何抓取,怎么分析Dump文件?知道吗?
- 谈谈JVM中,类加载器你的认识?rt-jar等
JVM探究
JVM的位置
- JVM的体系结构
- 类加载器
package nan.n;
import java.util.Arrays;
import java.util.List;
public class TestClassLoader {public static void main(String[] args) {Student student = new Student();Class<? extends Student> aClass = student.getClass();ClassLoader classLoader = aClass.getClassLoader();//获取类加载器System.out.println(classLoader); //AppClassLoader加载器》应用类加载器String propertyApp = System.getProperty("java.class.path");List<String> listApp = Arrays.asList(propertyApp);System.out.println("应用类加载器加载的类》》》》》》》》》》》》》》》》》》》》》》");for (int i = 0; i < listApp.size(); i++) {System.out.println(listApp.get(i)+"\n");}System.out.println("======================================华丽的分界线===============================");System.out.println(classLoader.getParent());//扩展类加载器String propertyExt = System.getProperty("java.ext.dirs");List<String> listExt = Arrays.asList(propertyExt);System.out.println("扩展类加载器加载的类》》》》》》》》》》》》》》》》》》》》》》");for (int i = 0; i < listExt.size(); i++) {System.out.println(listExt.get(i)+"\n");}System.out.println("======================================华丽的分界线===============================");System.out.println(classLoader.getParent().getParent());String propertySys = System.getProperty("sun.boot.class.path");List<String> listSys = Arrays.asList(propertySys);System.out.println("系统【启动】类加载器加载的类》》》》》》》》》》》》》》》》》》》》》》");for (String listSy : listSys) {System.out.println(listSy);}}
}
class Student{}
双亲委派机制【话不多说上图看】- 双亲委派机制【话不多说上图看】
沙箱安全机制- 沙箱安全机制
Java安全模式额核心就是Java沙箱【sandbox】
话不多说肝着上图
Native
package nan.n;
public class NativeTest {public static void main(String[] args) {new Thread(() ->{},"test01").start();}//native:凡是带了native关键字的,说明Java的作用范围达不到了,会去调用底层语言的库【这里是C++】//会进入本地方法栈//调用本地方法本地接口 JNI 【Java_Native_Interface】//JNI作用:扩展Java的作用,融合其他语言为Java所用 eg:C、C++//Java诞生的时候C、C++横行,想立足就必须调用C、C++程序//于是Java就专本开辟了一个标记native的标记区域:Native_Method_Stack 也就是本地方法栈 用于标记native方法//在最终执行的时候会通过JNI加载本地方法库中的方法//常用于Java驱动硬件,管理系统 企业级应用不常用private native void start0();//调用其他接口: Socket,WebService
}
方法区【此区域属于共享区间】
注意:静态变量、常量、类信息(构造方法,接口)、运行时常量池放在方法区,但是实例变量存在堆内存中和方法区无关!
package nan.n;
public class Car {private int price;private String name = "别克";public static void main(String[] args) {Car car1 = new Car();
// car1.name = "洗脚城ct6";System.out.println(car1.name);}
}
PC寄存器(百度了解即可)
栈:数据结构
程序=数据结构+算法;程序=框架+业务逻辑:淘汰
- 栈:先进后出,后进先出【想象成一个桶】
- 队列:先进先出【FIFO(Firist Input First Output)想象成管道】
- 喝多了吐就是栈,吃多了拉就是队列
package nan.n;
public class TestStack {public static void main(String[] args) {//main()先加载到栈中 //main调a方法,a也加载到栈new TestStack().a();}public void a(){ }
}
栈溢出之递归
package nan.n;
public class TestStack {public static void main(String[] args) {//main()先加载到栈中//main调a方法,a也加载到栈new TestStack().a();}public void a(){b();//加载b到栈}public void b(){a();//加载a到栈}
}
从上面可以看到栈内存、主管程序的运行、生命周期和线程同步。线程执行完,栈内存释放所以说栈没有垃圾回收
**栈:**8大基本数据类型、对象的引用、实例的方法
三种JVM
- Sun公司的HotSpot【我们学习的】
- Orache JRockit,原先叫Bea JRockit
- IBM
堆
Heap,一个JVM只有一个堆内存,并且堆内存的大小是可以调节的
类加载器读取文件一般会把类、方法、常量、变量保存我们所引用的真实对象到堆中
堆中还分三个区域:
- 新生区/伊甸园区 EdenSpace
- 养老区
- 永久区
新生区、永久区、堆内存调优
新生区
- 新创建的对象在这里
- 如果对象没有被GC垃圾回收则会进入幸存者0/1区【新生区和老年区内存满了就会由重量级GC垃圾回收,一般情况下不会进入老年区】
- 百分之99的对象都是临时的
手动配置JVM内存
package nan.n;
public class TestCon {public static void main(String[] args) {long max = Runtime.getRuntime().maxMemory();//获取运行时想用的最大内存long total = Runtime.getRuntime().totalMemory();//获取使用的总内存int availableProcessors = Runtime.getRuntime().availableProcessors();//可用处理器的个数System.out.println(max+"字节也就是"+(double)(max/1024/1024)+"兆");System.out.println(total+"字节也就是"+(double)(total/1024/1024)+"兆");System.out.println(availableProcessors);}
}
运行结果
OOM错误
使用JProfile工具分析OOM原因
首先在IDEA安装插件JProfiler
JProfiler工具下载地址:https://www.ej-technologies.com/download/jprofiler/version_92
安装教程无脑下一步
License Key:
L-Larry_Lau@163.com#23874-hrwpdp1sh1wrn#0620
L-Larry_Lau@163.com#36573-fdkscp15axjj6#25257
L-Larry_Lau@163.com#5481-ucjn4a16rvd98#6038
L-Larry_Lau@163.com#99016-hli5ay1ylizjj#27215
L-Larry_Lau@163.com#40775-3wle0g1uin5c1#0674
重启IDEA多一个图标看下图JProfiler
配置JProfiler可执行文件
自己写的时候错误是可以在控制台看到的
package nan.n;
import java.util.ArrayList;
public class JProfileTest {char [] chars = new char[1*1024*1024];//1mpublic static void main(String[] args) {//在这里我们可以用try-catch抛出异常看控制台ArrayList<JProfileTest> list = new ArrayList<>();int count = 0;try {while (true){list.add(new JProfileTest());count++;}}catch (Error error){System.out.println("第"+count+"次抛出异常");error.printStackTrace();}}
}
但是企业中项目是部署到服务器上的此时就要用到JProfiler工具类看错误出在哪里
话不多说,先配置VM options【简单查看dump文件】
Dump文件生成后所在位置
GC介绍之引用计数法
JVM在进行GC时,并不是对这三个区域进行统一回收,大部分时候都是在新生区
- 新生区
- 幸存区:【from和to】
- 老年区
GC两种类:轻GC(普通垃圾回收)、重GC(全局垃圾回收)【名字看你自己理解】
题目:
- JVM的内存模型和分区【详细到每个区放什么】
- 堆里面的分区有哪些?新生区【Eden,from,to】、老年区,说说他们的特点
- GC算法有哪些?标记清除法、标记整理/标记压缩、复制算法、引用计数器,怎么用?
- 轻GC和重GC分别在什么时候发生?
GC复制算法
- 可以简单的说GC复制算法就是作用于新生区的 from和to区
- 好处:没有内存碎片
- 坏处:也就是浪费了一个幸存者区也就是to区,复制算法上面也说了就是to区永远都是空的
**最佳使用场景:**新生区,毕竟嘛对象存活率较低
标记清除压缩算法
上图就完了
- 标记清除算法:
- 好处:不需要额外的空间
- 坏处:消耗时间多,标记一次、清除一次,有内存碎片
- 标记压缩算法:清除了内存碎片,但是又加长了时间,应该说是用时间换空间
小总结
内存效率:复制算法>标记清除法>标记压缩法
内存整齐度:复制算法=标记压缩法>标记清除法
内存利用率:标记压缩法=标记清除法>复制算法
所以说算法没有最优的,只有最合适的_GC:又叫分代收集算法
年轻代:存活率低,复制算法很合适
等死代:区域大,标记清除(内存碎片不是很多)+标记压缩混合使用
初探JVM也就这么多了,笔记我认为还是很全的!送给不想看视频的你!
加油吧打工人【手动雷姆!】
JVM初探究【JVM入门教程】相关推荐
- php的swoole教程,PHP + Swoole2.0 初体验(swoole入门教程)
PHP + Swoole2.0 初体验(swoole入门教程) 环境:centos7 + PHP7.1 + swoole2.0 准备工作: 一. swoole 扩展安装 1 .下载swoole cd/ ...
- Clojure入门教程: Clojure – Functional Programming for the JVM中文版
http://xumingming.sinaapp.com/302/clojure-functional-programming-for-the-jvm-clojure-tutorial/ api:h ...
- 深入探究JVM(1) - Java的内存区域解析
深入探究JVM(1) - Java的内存区域解析 Java 虚拟机在执行Java程序的时候会把它管理的内存区域划为几部分,这一节我们就来解析一下Java的内存区域. 有的人把JVM管理的内存简单地分为 ...
- 【JVM 由浅入深】JVM入门
JVM入门 1. 概述 今天我们对JVM 进行入门讲解,让我们了解下什么是JVM,是专门为Java服务的一款产品吗??? 好了废话不多说了,让我们开始吧 2. 详解 2.1 Java 是跨平台的 为什 ...
- JVM原理探究及调优方法论
1 此文目的 本文不准备从盘古开天地开始讲述JVM的种种,相关的文章网上太多了,大多也无非转来转去,连图都差不多.笔者只整理个提纲挈领的学习路线指南,并对自己学习过程中遇到的坑和容易混淆和忽视的地方作 ...
- JVM史上最佳入门指南
提到Java虚拟机(JVM),可能大部分人的第一印象是"难",但当让我们真正走入"JVM世界"的时候,会发现其实问题并不像我们想象中的那么复杂.唯一真正令我们恐 ...
- ArcEngine 入门教程-控件初体验
缘起 个人总结梳理,顺便练练文笔,For me and for you like me! 目标 我一直很认同古人所说的君子性非异也,善假于物也,本文主要目的是告诉读者如何使用帮助来学习了解ArcEng ...
- 腾讯云香港轻量服务器宝塔Linux镜像入门教程(初体验)
腾讯云轻量应用服务器30M峰值带宽24元/月,价格很不错新手站长网选择了一台入门级1核1G的轻量应用服务器lighthouse,镜像安装宝塔Linux面板,新手站长网来详细说下腾讯云香港轻量应用服务器 ...
- 跟南桑深入探究JVM
1.JVM的学习方式 请你谈谈你对JVM的理解?java8虚拟机和之前的变化更新? 什么是OOM?什么是栈溢出?怎么分析? JVM的常用调优参数有哪些? 内存快照如何抓取,怎么分析Dump文件? 谈谈 ...
最新文章
- confluence mysql 中文乱码_解决confluence的乱码问题
- SQL Date Utility
- Discuz!X论坛开发(九)二次开发之Discuz X2 文件目录功能详解
- dsp课程设计c语言源码,DSP课程设计-基于C语言实现256点的FFT精选.pdf
- 集合计数 (容斥原理)
- 学习和使用web标准的十大理由
- WinAPI: SetTextJustification - 设置两端对齐
- 基于Python的Climate Indices库计算SPEI(标准化降水蒸散发指数)01—Climate Indices库的下载和安装
- dota2服务器位置设置在哪里,《DOTA2》自走棋国服怎么进入 自走棋国服服务器进入方法...
- python如何登录并爬取获得百度指数统计图数据
- 哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(低年级)I 小乐乐切方块
- oracle11g迁移到DM8操作过程
- subtract用法c语言,操作 subtract() - 闪电教程JSRUN
- HDU 1043 Eight(八数码第七境界|A*+哈希+曼哈顿距离)
- 我要搬家到CSDN了,好吧
- MonoRail学习笔记六:Filter功能使用
- 1-17 Set集合和Map集合
- JUNIPER 升级
- cell delay和net delay
- Bootstrap模板Metronic设置默认选中侧边栏
热门文章
- linux的echo连接字符串输出,echo命令 – 输出字符串或提取She
- 计算机专业大创要求,计算机学院举行2018年度“大创项目”研究工作推进会
- Pandas+Pyecharts | 广州市已成交房源信息数据可视化
- poj 1087 A Plug for UNIX
- 优秀的项目周报应该如何写?【实例模板】
- 《致盛夏的七封情书》------------ 第二篇《初雨》
- 一起学 pixijs(1):常见图形的绘制
- 实例 | 能源区块链、物联网技术在智能电网中的趋势及前沿应用
- Kafka Tool Download
- 【隐私大战】疫情下的“奢侈品”