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类型,这个过程被 ...
随机推荐
- linux系统中errno与error对照表
1.使用了一个小程序输出所有的errno对应的error字符串,代码如下 #include <errno.h> void showError(int err){ printf(" ...
- CoreJava知识点1
一.基础 1.Java最大特点:开源open 2.J2EE由表示层.业务层.数据层组成 3.环境变量:javahome:JDK的安装路径 path:%javahome%\bin ——虚拟机 执行命令 ...
- C#中WinForm程序退出方法技巧总结(转)
本文实例总结了C#中WinForm程序退出方法技巧.分享给大家供大家参考.具体分析如下: 在c#中退出WinForm程序包括有很多方法,如:this.Close(); Application.Exit ...
- android中versionCode&versionName
原文来自:http://blog.csdn.net/wh_19910525/article/details/8660416 ,略有修改 一.概述 Android的版本可以在androidmainfes ...
- Week1 学长的经验教训
我手头拿到的是上一届学长的软件工程大作业,作业的名称是——汽车4S店信息管理系统. 这个大作业我认为还是非常典型的传统模式的大作业,由手机端(客户端)和服务端组成,非常的传统. ...
- 安装redis时遇到zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录
参考博文,http://www.phperz.com/article/14/1219/42002.html 解决办法 make MALLOC=libc
- phpmyadmin任意文件包含漏洞分析(含演示)
0x01 漏洞描述 phpmyadmin是一款应用非常广泛的mysql数据库管理软件,基于PHP开发. 最新的CVE-2014-8959公告中,提到该程序多个版本存在任意文件包含漏洞,影响版本如下: ...
- linux查看主机端口进程命令
1.查看主机信息 # more /etc/hosts # Do not remove the following line, or various programs # that require ne ...
- ubuntu安装配置jdk tomcat mysql ...
安装之前大家一定要检查好各个版本问题 以免造成不兼容. (一)下载所需安装包: jdk-7u76-linux-x64.tar.gz apache-tomcat-7.0.63.tar.gz MySQL- ...
- 2016HUAS暑假集训题1 A-士兵队列训练问题
A - 士兵队列训练问题 Description 某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从 ...