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时,并不是对这三个区域进行统一回收,大部分时候都是在新生区

  • 新生区
  • 幸存区:【fromto
  • 老年区

GC两种类:轻GC(普通垃圾回收)、重GC(全局垃圾回收)【名字看你自己理解】

题目:

  • JVM的内存模型和分区【详细到每个区放什么】
  • 堆里面的分区有哪些?新生区【Eden,from,to】、老年区,说说他们的特点
  • GC算法有哪些?标记清除法标记整理/标记压缩复制算法引用计数器,怎么用?
  • 轻GC和重GC分别在什么时候发生?

GC复制算法

  • 可以简单的说GC复制算法就是作用于新生区的 from和to区
  • 好处:没有内存碎片
  • 坏处:也就是浪费了一个幸存者区也就是to区,复制算法上面也说了就是to区永远都是空的
    **最佳使用场景:**新生区,毕竟嘛对象存活率较低

标记清除压缩算法

上图就完了

  • 标记清除算法:
  • 好处:不需要额外的空间
  • 坏处:消耗时间多,标记一次、清除一次,有内存碎片
  • 标记压缩算法:清除了内存碎片,但是又加长了时间,应该说是用时间换空间

小总结

内存效率:复制算法>标记清除法>标记压缩法
内存整齐度:复制算法=标记压缩法>标记清除法
内存利用率:标记压缩法=标记清除法>复制算法
所以说算法没有最优的,只有最合适的_GC:又叫分代收集算法

年轻代:存活率低,复制算法很合适
等死代:区域大,标记清除(内存碎片不是很多)+标记压缩混合使用

初探JVM也就这么多了,笔记我认为还是很全的!送给不想看视频的你!

加油吧打工人【手动雷姆!】

JVM初探究【JVM入门教程】相关推荐

  1. php的swoole教程,PHP + Swoole2.0 初体验(swoole入门教程)

    PHP + Swoole2.0 初体验(swoole入门教程) 环境:centos7 + PHP7.1 + swoole2.0 准备工作: 一. swoole 扩展安装 1 .下载swoole cd/ ...

  2. Clojure入门教程: Clojure – Functional Programming for the JVM中文版

    http://xumingming.sinaapp.com/302/clojure-functional-programming-for-the-jvm-clojure-tutorial/ api:h ...

  3. 深入探究JVM(1) - Java的内存区域解析

    深入探究JVM(1) - Java的内存区域解析 Java 虚拟机在执行Java程序的时候会把它管理的内存区域划为几部分,这一节我们就来解析一下Java的内存区域. 有的人把JVM管理的内存简单地分为 ...

  4. 【JVM 由浅入深】JVM入门

    JVM入门 1. 概述 今天我们对JVM 进行入门讲解,让我们了解下什么是JVM,是专门为Java服务的一款产品吗??? 好了废话不多说了,让我们开始吧 2. 详解 2.1 Java 是跨平台的 为什 ...

  5. JVM原理探究及调优方法论

    1 此文目的 本文不准备从盘古开天地开始讲述JVM的种种,相关的文章网上太多了,大多也无非转来转去,连图都差不多.笔者只整理个提纲挈领的学习路线指南,并对自己学习过程中遇到的坑和容易混淆和忽视的地方作 ...

  6. JVM史上最佳入门指南

    提到Java虚拟机(JVM),可能大部分人的第一印象是"难",但当让我们真正走入"JVM世界"的时候,会发现其实问题并不像我们想象中的那么复杂.唯一真正令我们恐 ...

  7. ArcEngine 入门教程-控件初体验

    缘起 个人总结梳理,顺便练练文笔,For me and for you like me! 目标 我一直很认同古人所说的君子性非异也,善假于物也,本文主要目的是告诉读者如何使用帮助来学习了解ArcEng ...

  8. 腾讯云香港轻量服务器宝塔Linux镜像入门教程(初体验)

    腾讯云轻量应用服务器30M峰值带宽24元/月,价格很不错新手站长网选择了一台入门级1核1G的轻量应用服务器lighthouse,镜像安装宝塔Linux面板,新手站长网来详细说下腾讯云香港轻量应用服务器 ...

  9. 跟南桑深入探究JVM

    1.JVM的学习方式 请你谈谈你对JVM的理解?java8虚拟机和之前的变化更新? 什么是OOM?什么是栈溢出?怎么分析? JVM的常用调优参数有哪些? 内存快照如何抓取,怎么分析Dump文件? 谈谈 ...

最新文章

  1. confluence mysql 中文乱码_解决confluence的乱码问题
  2. SQL Date Utility
  3. Discuz!X论坛开发(九)二次开发之Discuz X2 文件目录功能详解
  4. dsp课程设计c语言源码,DSP课程设计-基于C语言实现256点的FFT精选.pdf
  5. 集合计数 (容斥原理)
  6. 学习和使用web标准的十大理由
  7. WinAPI: SetTextJustification - 设置两端对齐
  8. 基于Python的Climate Indices库计算SPEI(标准化降水蒸散发指数)01—Climate Indices库的下载和安装
  9. dota2服务器位置设置在哪里,《DOTA2》自走棋国服怎么进入 自走棋国服服务器进入方法...
  10. python如何登录并爬取获得百度指数统计图数据
  11. 哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(低年级)I 小乐乐切方块
  12. oracle11g迁移到DM8操作过程
  13. subtract用法c语言,操作 subtract() - 闪电教程JSRUN
  14. HDU 1043 Eight(八数码第七境界|A*+哈希+曼哈顿距离)
  15. 我要搬家到CSDN了,好吧
  16. MonoRail学习笔记六:Filter功能使用
  17. 1-17 Set集合和Map集合
  18. JUNIPER 升级
  19. cell delay和net delay
  20. Bootstrap模板Metronic设置默认选中侧边栏

热门文章

  1. linux的echo连接字符串输出,echo命令 – 输出字符串或提取She
  2. 计算机专业大创要求,计算机学院举行2018年度“大创项目”研究工作推进会
  3. Pandas+Pyecharts | 广州市已成交房源信息数据可视化
  4. poj 1087 A Plug for UNIX
  5. 优秀的项目周报应该如何写?【实例模板】
  6. 《致盛夏的七封情书》------------ 第二篇《初雨》
  7. 一起学 pixijs(1):常见图形的绘制
  8. 实例 | 能源区块链、物联网技术在智能电网中的趋势及前沿应用
  9. Kafka Tool Download
  10. 【隐私大战】疫情下的“奢侈品”