jvm

Java面试系列01:Java基础之JVM

那年仲夏 提交于 2020-03-17 05:33:36
参考链接: JVM之内存结构详解 https://www.choupangxia.com/2019/10/18/jvm%E4%B9%8B%E5%86%85%E5%AD%98%E7%BB%93%E6%9E%84%E8%AF%A6%E8%A7%A3/ 绪论 1.什么是Java虚拟机? Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。 2.为什么Java被称作是“平台无关的编程语言”? 一般的高级语言如要在不同的平台上运行,至少需要编译成不同的目标代码。Java虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。而引入JVM后,Java语言在不同平台上运行时不需要重新编译。Java语言使用模式Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。 3.jvm最大内存限制多少? 默认是物理内存的1/64,JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。 一、Java 类加载过程? 类加载器就是寻找类或接口字节码文件进行解析并构造JVM内部对象表示的组件。 在java中类装载器把一个类装入JVM,经过以下步骤: 加载

Java第六周

风流意气都作罢 提交于 2020-03-17 01:49:46
这次讲了 异常 程序在运行过程中出现的特殊情况。 Throwable 一切错误或异常的父类。 Error:JVM、硬件、执行逻辑错误,不能手动处理; Exception:程序在运行和配置中产生的问题,可处理; Exception子类RuntimeException:运行时异常,可处理,可不处理; Exception子类CheckedException:首查异常,必须处理; 自动抛出异常:当程序在运行过程中遇到不符合规范的代码或结果时,会产生异常; 手动抛出异常:语法 throw new 异常类型(“实际参数”); throw new RuntimeException ( ) ; throw new CheckedException ( ) ; 产生异常的结果:相当于遇到 return 语句,导致程序终止; 异常的传递:按照方法的调用链反向传递,如始终没有处理异常,最终会由JVM进行默认异常处理(打印堆栈信息); public static void main ( String [ ] args ) throws Exception { m1 ( ) ; } public static void m1 ( ) throws Exception { m2 ( ) ; } public static void m2 ( ) throws Exception { throw new

JVM 基础(1) -- Java 的内存结构

只谈情不闲聊 提交于 2020-03-16 19:54:31
以黄小斜博文为主的学习总结 文章目录 1. 了解 JVM 内存有什么好处 2. JVM 主要组成部分 3. 运行时数据区的五大组成部分 1. 程序计数器 2. Java 虚拟机栈 3. 本地方法栈 4. Java 堆 5. 方法区 4. 控制各区域大小的参数 1. 了解 JVM 内存有什么好处 所有的 Java 开发人员可能会遇到这样的困惑:我该为堆内存设置多大空间呢?OutOfMemoryError 的异常到底涉及到运行时数据区的哪块区域?该怎么解决呢? 其实如果你经常解决服务器性能问题,那么这些问题就会变的非常常见,了解 JVM 内存可以帮助我们在服务器出现性能问题的时候,快速的了解哪块内存区域出现了问题,以便快速的解决生产故障。 2. JVM 主要组成部分 JVM 主要由 类加载器 、运行时数据区 、执行引擎和本地库接口四部分组成。 JVM 工作的流程大致就是:首先由类加载器将我们的 .class 文件加载进运行时数据区,然后 JVM 会在堆中创建一个对应类的 Class 对象,但由于我们的字节码只是 JVM 的一套指令集规范,并不能直接交给底层的操作系统去执行,所以这里就需要用到特定的字节码解析器执行引擎将我们的字节码解析成底层操作系统可以执行的机器指令,然后交由 CPU 去执行,在执行的过程中可能还需要用到其他语言的本地库接口进而完成整个程序的功能。 3.

一、JVM运行时数据区域

孤人 提交于 2020-03-16 18:55:19
某厂面试归来,发现自己落伍了!>>> JVM运行时数据区 其中 方法区 和 java堆 为 多线程共用区域 其余为现成私有区域 程序计数器: 当前线程执行的字节码的行号的存放空间,字节码解释器通过改变这个值来获取下一条执行字节码,各条线程都独立,互不影响; 如果正在执行的是Java方法,则在计数器中记录的是虚拟机字节码指令的地址; 若是Native方法,则记录的值为Undefined; 此区域没有规定OutOfMemoryError Java虚拟机栈: 用于存放局部变量 虚拟机栈用于存储编译期可知的基本类型(int、long等)、对象的引用(实例在java堆中地址)和一条字节码指令的地址 栈帧:每个方法执行时会把方法的局部变量、操作数栈、方法出口等信息存到一个栈帧中,即一个方法的执行就是一个栈帧从入栈到出栈的过程 每个方法在编译期会把方法中局部变量所占用的空间进行分配,即在方法执行可以得到的局部变量空间是完全确定的 本地方法栈: 用于存放本地方法(即用native关键字修饰的方法) 虚拟机对于方法的语言、使用方式和数据结构都没有特殊的规定,可有虚拟机自己实现 Java堆: JVM内存管理中最大的一块 用于存放对象实例和数组 垃圾回收的主要区域 方法区(有些地方叫 -- 非堆): 用于存放已经被虚拟机加载的类信息、常量、静态变量等数据 常量池:类信息中的一部分,用于存放字面量

关于Java变量的可见性问题

你离开我真会死。 提交于 2020-03-16 11:54:15
某厂面试归来,发现自己落伍了!>>> 关于Java变量的可见性问题 博文前提 最近在oschina问答板块看到了一个关于java变量在工作内存和主存中的可见性问题: synchorized,sleep 也能达到volatile 线程可见性的目的? ,大致的问题描述如下: package com.test; import java.util.concurrent.TimeUnit; public class test1 { private static boolean is = true; public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { int i = 0; while(test1.is){ i++; 1 //synchronized (this) { } 会强制刷新主内存的变量值到线程栈? 2 //System.out.println("1"); println 是synchronized 的,会强制刷新主内存的变量值到线程栈? 3 //sleep 会从新load主内存的值? // try { // TimeUnit.MICROSECONDS.sleep(1); // }catch (InterruptedException e) {

JDK、JRE、JVM三者间的关系

旧时模样 提交于 2020-03-16 02:40:43
     文章出处:http://playkid.blog.163.com/blog/static/56287260201372113842153/   JDK(Java Development Kit)是针对Java开发员的产品,是整个Java的核心,包括了Java运行环境JRE、Java工具和Java基础类库。Java Runtime Environment(JRE)是运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。JVM是Java Virtual Machine(Java虚拟机)的缩写,是整个java实现跨平台的最核心的部分,能够运行以Java语言写作的软件程序。        在计算机开发语言的历史中,从来没有哪种语言象Java那样受到如此众多厂商的支持,有如此多的开发工具。      JDK(Java Development Kit)   JDK是Java开发工具包,是Sun Microsystems针对Java开发员的产品。   JDK中包含JRE,在JDK的安装目录下有一个名为jre的目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib和起来就称为jre。   JDK是整个JAVA的核心,包括了Java运行环境JRE(Java Runtime Envirnment)

JAVA基础(一)--- 基础语法篇

 ̄綄美尐妖づ 提交于 2020-03-16 01:08:48
好久没有写博客了,,大四狗真的好忙,大学也快毕业啦,疫情期间,在家里忙着弄毕设,以后会定时更新博客😁 武汉加油!!!中国加油!!! 一、JAVA概述 1、概述 Java于1990年底由Sun公司的詹姆斯高斯林团队开发,原名Oak;1995年更名为JAVA;后于2009年被Oracle公司收购。Java的三个方向:JAVASE;JAVAEE;JAVAME。 2、Java语言的特点 面向对象,跨平台等。 3、跨平台,Java为什么可以跨平台? 跨平台指的是跨操作系统,常见的操作系统有Windows,Linux,MacOS等操作系统。Java号称一次编译,到处执行,那么Java语言是如何实现跨平台的呢?原因就在于Java引入了JVM机制,JVM(Java Virtual Machine )即Java虚拟机。JVM是Java跨平台的核心,Java程序经过编译后生成字节码文件,然后字节码文件会加载到JVM上运行将字节码文件翻译为操作系统可以理解的指令,JVM机制很好的屏蔽了底层操作系统的差异性,这样就实现了Java的跨平台。值得注意的是,Java是跨平台的,但是JVM不是跨平台的,不同的操作系统有不同的JVM,JVM是一个机制,不同的公司会研发自己的JVM,如IBM等大型公司都有自己的JVM,目前市面上最常见的还是Sun公司的HotSpot版本。 二、基础知识 1、关键字

Linux从程序到进程

99封情书 提交于 2020-03-15 07:24:16
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢! 整个教程 中已经不时的出现一些内存管理和垃圾回收的相关知识。这里进行一个小小的总结。 Java是在JVM所虚拟出的内存环境中运行的。内存分为栈(stack)和堆(heap)两部分。我们将分别考察这两个区域。 栈 栈的基本概念参考 纸上谈兵: 栈 (stack) 。许多语言利用栈数据结构来记录函数调用的次序和相关变量(参考 Linux从程序到进程 )。 在Java中,JVM中的栈记录了线程的方法调用。每个线程拥有一个栈。在某个线程的运行过程中,如果有新的方法调用,那么该线程对应的栈就会增加一个存储单元,即帧(frame)。在frame中,保存有该方法调用的参数、局部变量和返回地址。 调用栈 Java的参数和局部变量只能是 基本类型 的变量(比如int),或者对象的 引用 (reference)。因此,在栈中,只保存有基本类型的变量和对象引用。 引用所指向的对象保存在堆中。(引用可能为Null值,即不指向任何对象) 引用与对象 当被调用方法运行结束时,该方法对应的帧将被删除,参数和局部变量所占据的空间也随之释放。线程回到原方法,继续执行。当所有的栈都清空时,程序也随之运行结束。 堆 如上所述,栈(stack)可以自己照顾自己。但堆必须要小心对待

JVM二

不打扰是莪最后的温柔 提交于 2020-03-14 20:21:54
12.GC详解 垃圾回收: 分代收集算法 不同的区域使用不同的回收算法 Young代:GC频繁区域 Old代:GC次数较少 Perm代:不会产生GC! 一个对象的历程: JVM在进行GC时,并非每次都对三个区域进行扫描的。大部分的时候都是指的新生代。 普通GC:只针对新生代【GC】 Full GC:主要是针对老年代,偶尔伴随新生代【Full GC】 1.JVM内存模型,每个区中存放什么? 2.堆中的分区:Eden,S from to,老年代,说说他们的特点。 3.GC的三种收集算法:标记清除,标记整理,复制算法,请你谈谈他的特点? 13.GC四大算法 引用计数法: 特点:每个对象都有一个引用计数器,每当对象被引用一次,计数器+1,如果引用失效,则计数器-1,如果为0,则GC可以清理。 缺点: 计数器维护麻烦 循环引用无法处理 JVM一般不采用这种方式(JVM一般采用可达性算法。) 复制算法 年轻代就是用的复制算法 1、一般普通GC之后,差不多Eden几乎都是空的了 2、每次存活的对象,都会被从from区和Eden区活着的对象复制到to区,这时from和to会发生一次交换:谁空谁是to,每当幸存一次,就会导致这个对象的年龄+1;如果这个年龄值大于15(默认值),就会进入养老区。 优点:没有标记和清楚的过程,效率高,没有内存碎片 缺点:to区永远是空的,需要 浪费双倍的空间 Eden区

带着新人看java虚拟机03

喜欢而已 提交于 2020-03-14 20:15:40
  分享一篇博客:https://blog.csdn.net/yfqnihao/article/details/8289363,本篇有部分参考这篇博客!!!   还是继续说一下java虚拟机,为什么呢?因为我随意翻着别人的博客一不小心看到有关jvm的一点新的东西,挺有趣的,就按照我的理解分享一下;   还记得以前学过一首诗,“看成岭侧成峰,远近高低各不同”,这一句诗的内在含义有的时候真的会让你猛然惊醒,进而如获至宝!的确,有的时候换一个角度看问题,你会发现不一样的世界。   我们平常学java的时候肯定涉及到了进程,多线程的概念,但是有没有想过操作系统也有进程和线程的概念,两者有关系吗?假如我们视角放高一点,以操作系统的角度看看一个java程序的运行,又会是什么样子的呢?jvm在将字节码文件翻译成机器码之后怎么会调用cpu呢?自己调用的还是假借了谁的手呢?jvm在操作系统中到底扮演着一个什么角色呢?还有最基本的一个问题,操作系统是什么?   下面我们就来把这些东西整个的给串一下,当然,具体的细节还要每个人自己去研究; 1.简单看看操作系统   水平有限,不可能对操作系统理解得那么透彻,只是说说我自己的理解吧!   一说起操作系统大家肯定既陌生又贼熟悉,为什么呢?因为我们经常使用操作系统,比如windows系列,unix系列,macos等等