jvm初步入门

本博客中的所有内容都是来自b站狂神说视频教程,如有侵权联系我删除。

下面是视频链接:b站狂神说

关于jvm的几个小问题

1. jvm的位置:

jvm是一个运行在操作系统上的用c语言编写的虚拟机(就好像是一个软件。)我们写的java软件在jvm上运行。

2. jvm的体系结构:

3. 类加载器:

作用:

加载class文件~

加载顺序

  1. 虚拟机自带的加载器

  2. 启动类(根)的加载器

  3. 扩展类加载器

  4. 应用程序加载器

4. 双亲委派机制:

双亲委派机制就是java中,当一个类要被加载的时候,会先从应用程序加载器加载,然后再去3,2,1中,去找有没有我们需要的方法。如果2中没有,就用3中的方法,如果3中没有就用4中的方法。当后加载的抛异常,才会用先加载的。

这同时也说明了java= c++-- 封装了c++中的指针,内存管理,垃圾回收。。。。

5. 沙箱安全机制:

1. 什么是沙箱?

沙箱就是限制程序运行的一个环境

在类加载之前,保证有一些代码不会被加载。来保护java jvm不会被破坏

6. native

navtive表示调用java之外的东西为自己所用。其他的语言(最初是为了调用C,C++)。native会调用JNI,通过JNI来调用系统中的东西。

7. 方法区有哪些东西?

方法区中只有:static,final,CLass,常量池~

栈:一种数据结构

程序=数据结构+算法

栈:先进后出,后进先出。(就好像一个桶)

队列:先进先出

java程序在开始运行的时候,先把main方法放到栈中,再由main方法去调用其他需要的方法,如果main方法被弹出栈,程序也就运行结束了。

栈溢出

方法之间循环调用,不停的把方法放入栈中,导致,栈储存满,这样就会栈溢出。

当一个方法运行结束后,就会被弹出栈,当main被弹出栈,程序运行结束。

当一个线程结束,栈内存就会被释放,对于栈来说,不存在垃圾回收问题。

程序正在运行的方法,一定在栈的顶部

栈+堆+方法区的交互关系:

三种jvm

我们通常用的都是Java HotSpot(TM)这个虚拟机,他是由sun提供的虚拟机。

一个jvm只有一个堆内存,堆内存的大小是可以调节的

类加载器读取类文件后,一般会把什么东西放到堆中?

类,方法,常量,变量~,保存我们所有引用类型的真实对象。

堆内存的三个区域

  • 新生区 (young/new)

    新生区分为伊甸园区、幸存0区、幸存1区。

    只有在幸存0区或者幸存1区经过十几次循环的数据,才会进入养老区

    上面这个循环的过程叫做轻gc

  • 养老区 (old)

    上面的数据到养老区就会进行一次重gc(full GC)

    经过上面的筛选之后的数据会进入养老区,当养老区快要满时(整个堆都款要播爆了!),就会爆OOM

  • 永久区 (perm)

    方法区(非堆)就在元空间中存放

    在jdk8之后,永久区改名叫做元空间

GC垃圾回收主要在伊甸园区和养老区。

假设内存满了,OOM,堆内存不够。

新生区

类诞生和成长的地方,甚至死亡(当第一次被垃圾回收之后就会死亡)

  • 伊甸园区:

    所有的对象都是在伊甸园区被new出来的

  • 幸存区(0区,1区):

永久区(元空间)

这个区域用来存放jdk自身携带的一些class文件,interface元数据主要用来存储java运行时的环境。这个区域不存在垃圾回收!关闭jvm的时候才会释放这个区域的内存。

如果一个程序报OOM错误要怎么处理?

  1. 尝试扩大堆内存,看结果。

  2. 分析结果,看一下哪个地方出现了问题(专业工具)

    上面说的专业工具就是jprofiler,利用这个在jvm中让他生成dump文件,然后利用jprofiler来查看dump文件。具体的问题出现在哪里。

GC:垃圾回收

gc垃圾回收大部分回收的都是新生代,然后是幸存区,老年区

gc分两种:轻gc和重gc

GC垃圾回收常用的算法:

引用计数法(太low了,不高效)

给堆里的方法添加一个计数装置,记录每个方法的使用此时,清除掉没有被使用的方法。py多用这种方法来回收垃圾。

  • 好处:可以回收垃圾。
  • 坏处:占用了新的内存空间,来计数。而且会产生垃圾碎片。

复制算法

把新生代分成两块区域,使两个区域不断的复制,用这种方法来不断的进行轻gc。

  • 好处:不会产生垃圾碎片。
  • 坏处:减少了一半的空间。

标记清除压缩算法:

先进行一次扫描,扫描到所有需要用到的方法,给他们标记。

然后再进行一次扫描,清除掉没有用到的方法。

又进行一次扫描,把标记的方法全部移动到一块区域,然后清除掉除这以外的区域。

  • 好处:垃圾清理干净,压缩后不会有垃圾碎片。
  • 坏处:需要进行多次扫描。耗费性能。

没有最好的垃圾清理算法,只有最合适的算法。

JMM Java Memory Model(java内存模型):

缓存的一致性协议,用于定义数据读写的规则。

JMM定义了线程的工作内存和主内存之间的抽象关系。

利用volatite关键字解决共享对象可见性,保证数据一致性。

JVM初步入门(很初级,建议只做大致了解用)的更多相关文章

  1. [think]关于个人发展值得记住的一些建议 听别人的话,即使你不想听 不要只做不想 成功不能被复制,但失败总在不停复制。看看别人是怎么倒下的,你可以更早地成功

    [think]关于个人发展值得记住的一些建议 偶然看到一篇采访周爱民的文章,里面的一些建议虽然朴实无华,却感觉很有道理,特此记录: 记者:对于程序员的技术发展和职业规划能否给大家一些建议呢?----- ...

  2. 编写高质量代码改善C#程序的157个建议——建议144:一个方法只做一件事

    建议144:一个方法只做一件事 “单一职责原则”(SRP)要求每一个类型只负责一件事情.我们将此概念扩展到方法上,就变成了:一个方法只做一件事. 回顾上一建议的代码,LocalInit和RemoteI ...

  3. Python 正则表达式入门(初级篇)

    Python 正则表达式入门(初级篇) 本文主要为没有使用正则表达式经验的新手入门所写. 转载请写明出处 引子 首先说 正则表达式是什么? 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达 ...

  4. 转载 Python 正则表达式入门(初级篇)

    Python 正则表达式入门(初级篇) 本文主要为没有使用正则表达式经验的新手入门所写.转载请写明出处 引子 首先说 正则表达式是什么? 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达式 ...

  5. Shel脚本-初步入门之《06》

    Shel脚本-初步入门-06 Shell 脚本的建立和执行 6.Shell 脚本的建立和执行 6.1 Shell脚本的建立 在 Linux 系统中,Shell 脚本(bash Shell 程序)通常是 ...

  6. 踢爆IT劣书出版黑幕——由清华大学出版社之《C语言入门很简单》想到的(1)

    1.前言与作者 首先声明,我是由于非常偶然的机会获得<C语言入门很简单>这本书的,绝对不是买的.买这种书实在丢不起那人. 去年这书刚出版时,在CU论坛举行试读推广,我当时随口说了几句(没说 ...

  7. 2013年12月26日 星期四 doxygen入门--很好

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

  8. Java反射-初步入门

    Java反射-初步入门 学反射先了解什么是反射. 百度百科:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动 ...

  9. 发布SaaS加速器:我们不做SaaS,我们只做SaaS生态的推进者和守护者

    摘要: 此次阿里云推出的SaaS加速器,涵盖商业中心.能力中心.技术中心三大板块,是阿里巴巴商业.能力和技术的一次合力输出:技术能力在这里沉淀为一个个模块,ISV和开发者只要通过简单的操作,写很少的代 ...

随机推荐

  1. ETC1

    对纹理进行Alpha通道分离的好处 https://blog.csdn.net/u011926026/article/details/53982180 拆分贴图的Alpha通道 --对抗ETC1的原罪 ...

  2. 常用注解@Intdef与@Stringdef

    1.优点 可以代替枚举,静态常量,可以让注解只在代码中存在,编译后就删除,可以省内存. 2.@IntDef 2.1 官网 https://developer.android.com/reference ...

  3. 剑指 Offer 42. 连续子数组的最大和

    题目描述 输入一个整型数组,数组中的一个或连续多个整数组成一个子数组.求所有子数组的和的最大值. 要求时间复杂度为\(O(n)\). 示例1: 输入: nums = [-2,1,-3,4,-1,2,1 ...

  4. vue父子组件状态同步的最佳方式

    哈喽!大家好!我是木瓜太香,一位老牌儿前端工程师,平时我们在使用 vue 开发的时候,可能会遇到需要父组件与子组件某个状态需要同步的情况,通常这个是因为我们封装组件的时候有一个相同的状态外面要用,里面 ...

  5. [程序员代码面试指南]递归和动态规划-最小编辑代价(DP)

    问题描述 输入 原字符串StrOrg,目标字符串StrTarget,插入.删除.替换的编辑代价ic,dc,rc.输出将原字符串编辑成目标字符串的最小代价. 解题思路 状态表示 dp[i][j]表示把s ...

  6. 【深入理解Linux内核架构】第3章:内存管理

    3.1 概述 内存管理涵盖了许多领域: 内存中物理内存页的管理: 分配大块内存的伙伴系统: 分配小块内存的slab.slub.slob分配器: 分配非连续内存块的vmalloc机制: 进程的地址空间. ...

  7. Ansible基础认识及安装(1)

    Ansible简介 ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配置.批量 ...

  8. TS数据类型:类型别名/联合类型/字面量类型/类型推论等纲要

    在学C/C++  Java等强类型语言时,变量类型是唯一的,需要先指定.PHP JavaScript等弱类型语言时,无需指定变量类型 但是,TypeScript里面的联合类型 (Union Type) ...

  9. Alibaba内部SpringCloud参考笔记,在GitHub一天就标星81.6k?

    前言 阿里巴巴,作为国内互联网公司的Top,算是业界的标杆,有阿里背景的程序员,也更具有权威性.作为程序员,都清楚阿里对于员工要求有多高,技术人员掌握的技术水平更是望尘莫及.所以,大厂程序员的很多经验 ...

  10. tomcat源码之概述

    tomcat架构及常用的组件如下: Server Server代表了tomcat服务器,Tomcat启动时即会启动一个server实例,它监听在8005端口以接收shutdown命令,使用 telne ...