jvm基础笔记
名词解释:
三类参数:标准参数(可能不会变的,java -help列出来的就是这类的),X参数(非标准化参数),XX参数(扩展参数)。
所有XX 参数都以-XX开始,但后面出现的+-就不同了。+代表激活参数,-代表消除参数。
NIO new input/output -- jdk1.4引入的新类。使用native函数直接分配内存。可以避免java堆和native堆间来回切换。
虚拟机栈:存储局部变量表,动态链接,方法出口。线程私有,生命周期与线程一样。
本地方法栈:类似虚拟机栈。不同在于虚拟机栈执行java服务,本地栈执行native服务。
请求的栈深度大于虚拟机允许的深度:stackoverflow错误
关于栈的深度:每次方法调用都会有一个栈帧压入虚拟机栈,操作系统给JVM分配的内存是有限的,JVM分配给“虚拟机栈”的内存是有限的。
如果方法调用过多,导致虚拟机栈满了就会溢出。
这里栈深度就是指栈帧的数量。
扩展时无法申请到足够的内存:outofmemoryerror
java堆:存储对象实例。GC系统的主要区域。堆内容不够。outofmemoryerror
方法区(nonheap):各线程共享,常量,静态变量,类信息等。方法区有个别名叫permanent Generation(永久代)。
分配对象内存方式:指针碰撞(内存整齐的情况下) 空闲列表(内存不整齐的情况)
指针碰撞(
Serial、ParNew等带Compact过程的收集器
)
假设Java堆中内存是绝对规整的,所有用过的内存都放在一边,空闲的内存放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指针向空闲空间那边挪动一段与对象大小相等的距离,这种分配方式称为“指针碰撞”(Bump the Pointer)。空闲列表(
CMS这种基于Mark-Sweep算法的收集器
)
如果Java堆中的内存并不是规整的,已使用的内存和空闲的内存相互交错,那就没有办法简单地进行指针碰撞了,虚拟机就必须维护一个列表,记录上哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录,这种分配方式称为“空闲列表”(Free List)。
分配内存在并发情况下并不是线程安全的,有两种策略:1.CAS(乐观锁)配上失败重试。2.本地线程分配缓冲(TLAB)。预先将一小块内存分配给不同的线程,只有预分配内存不够时才采用同步锁机制。
内存溢出例子:
堆溢出:不断创建对象,在垃圾回收机制之前对象过多导致内存溢出。
现象:outofmemory, java heap space。
解决方案:分清是内存泄漏(memory leak)还是内存溢出(memory over flow)。dump出的堆转储快照进行分析。确认内存中的对象是否是必要的。
栈溢出:使用-Xss减少栈内存容量;定义大量的本地变量。
现象:stackoverflow
解决方案:使用虚拟机默认参数:在大多数情况下,达到1~2000的线程数并发是没有问题的。如果是多线程并发导致内存溢出的情况,在不能减少线程数或者升级内存的情况下,减少最大堆和减少栈容量也是一种方法。
方法区和运行时常量池溢出:
本机直接内存溢出:- XX设置。
现象:如果OOM之后Dump文件很小,可以考虑此原因。
判定对象是否存活:
普遍算法:给对象添加计数器。有一个引用+1。引用失效-1.计数器为0对象失效。
无法解决的问题:a.instance = b; b.instance = a;无其他引用,但计数器永远不会为0。
eclipse开启gc打印日志:
-verbose:gc (开启打印垃圾回收日志)
-Xloggc:eclipse_gc.log (设置垃圾回收日志打印的文件,文件名称可以自定义)
-XX:+PrintGCTimeStamps (打印垃圾回收时间信息时的时间格式)
-XX:+PrintGCDetails (打印垃圾回收详情)
可达性分析算法:通过一系列称为GC Root的对象作为起始点。当一个GC对象没有任何引用链相连,就是说GC Root对象不可达,则证明此对象不可用。
java语言中:GC Roots包括虚拟机栈引用的对象,方法区中类静态属性引用的对象,方法区常量引用的对象,本地方法栈中native引用的对象。
minor gc 和full gc
新生代gc:发生在新生代的gc动作。频繁。采用复制算法复制内存。
老生代gc:老生代的gc动作。不频繁,回收速度较慢。大对象直接进入老年代。典型的例子为:长字符串或者数组。jvm为了安置它们需要提前gc。
jvm基础笔记的更多相关文章
- java 笔记(1)-—— JVM基础,内存数据,内存释放,垃圾回收,即时编译技术JIT,高精度类型
1.java中5个存放数据的地方: (1).寄存器(Registers):位于CPU内部,是速度最快的存储区,但是数量和容量有限.在java中不能直接操作寄存器. (2).栈(Stack):栈位于通用 ...
- java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...
- java之jvm学习笔记二(类装载器的体系结构)
java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...
- java之jvm学习笔记十三(jvm基本结构)
java之jvm学习笔记十三(jvm基本结构) 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完全有信心,让概念在你的脑子里变成 ...
- jvm内存JVM学习笔记-引用(Reference)机制
在写这篇文章之前,xxx已经写过了几篇关于改jvm内存主题的文章,想要了解的朋友可以去翻一下之前的文章 如果你还不了解JVM的基本概念和内存划分,请阅读JVM学习笔记-基础知识和JVM学习笔记-内存处 ...
- JVM基础系列第2讲:Java 虚拟机的历史
说起 Java 虚拟机,许多人就会将其与 HotSpot 虚拟机等同看待.但实际上 Java 虚拟机除了 HotSpot 之外,还有 Sun Classic VM.Exact VM.BEA JRock ...
- C#面试题(转载) SQL Server 数据库基础笔记分享(下) SQL Server 数据库基础笔记分享(上) Asp.Net MVC4中的全局过滤器 C#语法——泛型的多种应用
C#面试题(转载) 原文地址:100道C#面试题(.net开发人员必备) https://blog.csdn.net/u013519551/article/details/51220841 1. . ...
- JVM学习笔记——字节码指令
JVM学习笔记——字节码指令 字节码 0与 1是计算机仅能识别的信号,经过0和1的不同组合产生了数字之上的操作.另外,通过不同的组合亦产生了各种字符.同样,可以通过不同的组合产生不同的机器指令.在不同 ...
- JVM学习笔记-第七章-虚拟机类加载机制
JVM学习笔记-第七章-虚拟机类加载机制 7.1 概述 Java虚拟机描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被 ...
随机推荐
- Maven_非法字符: '\ufeff' 解决方案
Idea在maven打包时报非法字符: '\ufeff' ,但打开报错的类看没有问题,后来发现是隐蔽字符BOM的问题,解决办法是用Notepad++打开这个类,然后改变编码格式为UTF-8 无DOM ...
- 翻译-In-Stream Big Data Processing 流式大数据处理
相当长一段时间以来,大数据社区已经普遍认识到了批量数据处理的不足.很多应用都对实时查询和流式处理产生了迫切需求.最近几年,在这个理念的推动下,催生出了一系列解决方案,Twitter Storm,Yah ...
- 李洪强iOS经典面试题135-Objective-C
可能碰到的iOS笔试面试题(5)--Objective-C 面试笔试都是必考语法知识的.请认真复习和深入研究OC. Objective-C 方法和选择器有何不同?(Difference between ...
- html5语义标签
- 使用Fiddler截断更改Request数据
0x01 Fiddler介绍 Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的“进出”Fiddler的数据.(百度百科) 0x ...
- bzoj4514: [Sdoi2016]数字配对--费用流
看了一眼题目&数据范围,觉得应该是带下界的费用流 原来想拆点变成二分图,能配对的连边,跑二分图,可行性未知 后来看到另外一种解法.. 符合匹配要求的数要满足:质因子的个数相差为1,且两者可整除 ...
- javascript事件有哪些?javascript的监听事件
事件类型: 1.界面事件 onload:描述文档,图片,css已经frame,object加载完毕时触发,window.onload window.onload = function(){ //代表图 ...
- java 与c#比较
1.开发周期方面:c#比java开发周期更快2.java出现的时间更长.开源性广.跨平台性好3.c#较为封闭.后出于java4.c#有无符号类型.java没有5.java与c#都有值类型.但是java ...
- java中的动态代理
1.动态代理的定义:为其他对象提供一个代理以控制对这个对象的访问 2.通过api看下proxy生成代理类的2中写法: 创建某一接口 Foo 的代理: InvocationHandler handler ...
- 创建 PDO 实例并在构造函数中设置错误模式
PDO 将只简单地设置错误码,可使用 PDO::errorCode() 和 PDO::errorInfo() 方法来检查语句和数据库对象.如果错误是由于对语句对象的调用而产生的,那么可以调用那个对象的 ...