Java JVM总结

一、jvm参数

1)内存

-Xms

-Xmx

-Xss

-Xloggc:file

-Xprof

-XX:+DisabledExplicitGC

-XX:PreBlockSpin

-XX:CompileThreshold

2)Parallel

-XX:SurvivorRatio
-XX:PreTenureSizeThreshold
-XX:MaxTenuringThreshold
-XX:+ParallelGCThreads
-XX:+UseAdaptiveSizePolicy

3)CMS

-XX:+UseConcMarkSweepGC

-XX:MaxTenuringThreshold

-XX:ParallelCMSThreads

-XX:CMSInitiatingOccupancyFraction

-XX:+UseCMSCompactAtFullCollection

-XX:CMSFullGCsBeforeCompaction

-XX:+CMSClassUnloadingEnabled

-XX:CMSInitiatingPermOccupancyFraction

-XX:GCTimeRatio

-XX:MaxGCPauseMillis

4)G1

-XX:+UseG1GC

-XX:MaxGCPauseMillis

-XX:GCPauseIntervalMillis

-XX:+G1HeapRegionSize

-XX:G1NewSizePercent

-XX:G1MaxNewSizePercent

-XX:GCTimeRatio

-XX:ConcGCThreads

-XX:InitiatingHeapOccupancyPercent

二、内存模型

(1)运行时数据区

程序计数器

Java 虚拟机栈

本地方法栈

Java 堆

方法区

(2)对象内存分配

1)内存分配方式

指针碰撞、空闲列表

2)内存分配策略

优先在 Eden 区分配、大对象直接进入老年代、长期存活对象将进入老年代

3)内存分配空间

1.栈分配

技术:逃逸分析、标量替换

缺点:无法栈上分配共享的对象 

2.TLAB

优点:尽量避免从堆上直接分配内存从而避免频繁的锁争用

缺点:有内存孔隙问题,影响 gc 扫描性能 

3.Eden

4.年老代

4)内存分配并发安全问题

同步处理(采用 CAS + 失败重试)

TLAB 上分配

5)对象的创建方式

new、Class.newInstance、Constructor.newInstance、clone、反序列化

6)对象的访问定位

句柄 、直接指针(HotSpot)

7)引用类型

强引用、软引用、弱引用、虚引用(幽灵引用/幻影引用)PhantomReference 

8)对象拷贝克隆

深拷贝和浅拷贝

拷贝有两种方式:
实现 Cloneable 接口并重写 Object 类中的 clone()方法;
实现 Serializable 接口,通过对象的序列化和反序列化实现克隆,可以实现真
正的深度克隆

9)内存使用

1.内存溢出

OOM错误:stackoverflow错误,permgen space错误

2.内存泄漏

类的静态变量

各种连接,如数据库连接、网络连接和IO连接等

变量不合理的作用域

内部类持有外部类

改变哈希值

单例模式

监听器

ThreadLocal的误用

三、GC

(1)判断垃圾

1)算法

引用计数(缺点:不能解决循环引用)、根可达性分析

2)GC roots

1.虚拟机栈(JVM stack)中引用的对象

2.方法区中类静态属性引用的对象

3.本地方法栈(Native Stack)引用的对象

(2)垃圾回收算法

复制、标记清除、标记整理、分代回收、分块回收

(3)hopspot垃圾回收器

1)GC类型

Minor GC

Major GC

Full GC(Major GC对老年代/永久代的stop the world的GC)

Mixed GC(G1)

1)新生代回收器

serial、parNew、parallelScavenge

2)老年代回收器

CMS、serialOld、parallelOld 

3)整堆回收器

G1

关系:(serial和parNew)搭配(CMS和serialOld)、parallelScavenge搭配(serialOld和parallelOld)、CMS并发模式失败后以serialOld做备份

4)CMS

1、运作步骤

初始标记(stop the world)、并发标记、重新标记(stop the world)、并发清除

2、优点

并发收集、低停顿

3、缺点

CMS收集器对CPU资源非常敏感

CMS收集器无法处理浮动垃圾(Concurrent Mode Failure)

CMS收集器会产生大量空间碎片

5)G1

1、特点

并行于并发、空间整合、可预测的停顿、分代收集

2、运作步骤

初始标记、并发标记、最终标记、筛选回收

(4)垃圾回收机制

1)GC触发的条件

Minor GC触发条件:当Eden区满时,触发Minor GC

Full GC触发条件:

1、调用System.gc时,系统建议执行Full GC,但是不必然执行

2、老年代空间不足

3、方法去空间不足

4、通过Minor GC后进入老年代的平均大小大于老年代的可用内存

5、由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小

6、 CMS GC时出现promotion failed和concurrent mode failure 

2)年轻代到年老代的晋升过程的判断条件

1、长期存活的对象进入老年代(15次MinorGC,JVM参数-XX:MaxTenuringThreshold)

2、动态对象年龄判定(大于等于某个年龄的对象超过了survivor空间一半)

3、如果对象的大小大于Eden的二分之一会直接分配在old,如果old也分配不下,会做一次majorGC。如果小于eden的一半但是没有足够的空间,就进行minor gc也就是新生代GC,minor gc后,survivor仍然放不下,则放到老年代

3)一次完整的 GC 流程

1.大对象直接进入到老年代
2.小对象先在eden区分配内存,当eden满了后,触发一次Minor GC,清理eden区域
3.存活下来的对象进入到survivor区域,年龄+1
4.当年龄>15(默认)时进入到老年代,当老年代满了后触发一次Full GC

4)fullGC 很频繁,线上排查问题

查看gc.log

 jmap -histo:live pid

-XX:+HeapDumpBeforeFullGC

jstat -gcutil pid

四、jvm分析

(1)jvm命令工具

jstack
jmap
jhat
jstat
jinfo
jps
jconsole, jvisualvm

(2)线程堆栈

1)线程堆栈信息

线程的名字、线程的优先级、线程 id、线程的状态、线程占用的内存地址、线程的调用栈

2)线程状态

NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED

3)分析性能问题

1、系统无缘无故的cpu过高

2、系统挂起,无响应

3、系统运行越来越慢

4、性能瓶颈(如无法充分利用cpu等)

5、线程死锁,死循环等

6、由于线程数量太多导致的内存溢出(如无法创建线程等)

五、类加载

(1)双亲委派模型

类加载器:Bootstrap、Extension、Application

(2)打破双亲加载

JNDI、JDBC、Tomcat

(3)类加载过程

装载、链接(验证、准备、解析)、初始化、使用、卸载

(4)类的实例化顺序

父类静态变量->父类静态代码块->子类静态变量->子类的静态代码块->父类成员变量->父类代码块->父类构造方法->子类成员变量->子类代码块->子类构造方法

(5)类装载方式

1)隐式装载

创建类对象、使用类的静态域、创建子类对象、使用子类的静态域。

其他特殊的隐式加载:
在JVM启动时,BootStrapLoader会加载一些JVM自身运行所需的class
在JVM启动时,ExtClassLoader会加载指定目录下一些特殊的class
在JVM启动时,AppClassLoader会加载classpath路径下的class,以及main函数所在的类的class文件

2)显式装载

ClassLoader.loadClass(className) :只执行装载过程。

Class.forName(className):执行类的装载、链接、初始化过程

注:1、Class.forName(className)是初始化类,newInstance()是实例化类。new是初始化加实例化类。2、new关键字和Class类的newInstance()的区别

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321977.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EF Core下利用Mysql进行数据存储在并发访问下的数据同步问题

小故事在开始讲这篇文章之前,我们来说一个小故事,纯素虚构(真实的存钱逻辑并非如此)小刘发工资后,赶忙拿着现金去银行,准备把钱存起来,而与此同时,小刘的老婆刘嫂知道小刘的品性&…

牛客练习赛50-记录

正题 比赛链接:https://ac.nowcoder.com/acm/contest/1080#question 成绩 本届 升高二届 总结 以后还是不要写太多自己不擅长的写法,空间要多检查,不要像个傻逼一样啥都写错。 尽量不要为了省一点空间和时间写一些不舒服的东西,尽量在能…

物联网框架ServerSuperIO在.NetCore实现跨平台的实践路线

正所谓天下大势,不跟风不行。你不跨平台,很low嘛。java说:你们能跨嘛,跨给我看看。C#说:不要强人所难嘛。java说:能部署在云上吗?docker?微服务?C#说:不要强人…

Spring Aop总结

一、什么是AOP 面向方面的编程(AOP)是一种编程技术,是面向对象编程的补充,它也提供了模块化。 在面向对象编程中,关键的单元是对象,AOP的关键单元是切面,或者说关注点。一些切面可能有集中的代…

P3750-[六省联考2017]分手是祝愿【期望dp】

正题 题目链接:https://www.luogu.org/problem/P3750 题目大意 nnn盏灯和按钮,每次随机选择一个xxx按下后会让xxx的倍数的灯都取反,然后若最少kkk步就可以将所有灯关闭那么直接选择最优策略,求关闭所有灯的期望次数。 解题思路 做期望dpdpd…

使用WebApiClient请求和管理Restful Api

前言本篇文章的内容是WebApiClient应用说明篇,如果你没有了解过WebApiClient,可以先阅读以下相关文章:WebApi client 的面向切面编程我来给.Net设计一款HttpClient.Net45下HttpClient的几个缺陷.net的retrofit--WebApiClient库.net的retrofit…

Spring MVC总结

一、Spring MVC (1)介绍 Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架。 通过把Model,View,Controller分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分&…

拥抱.NET Core系列:MemoryCache 缓存选项

MSCache项目MSCache 目前最新的正式版是 2.0.0,预览版是2.1.0,会与 .NETCore 2.1 一起发布。本篇用了2.0.0版本开源在 GitHub 上,仓库地址是:https://github.com/aspnet/CachingNuGet地址为:https://www.nuget.org/pac…

牛客练习赛51-记录

正题 比赛链接:https://ac.nowcoder.com/acm/contest/1083#question 成绩 可怜的zycT3zycT3zycT3被n0n0n0卡了半天,这里感谢一下排雷 总结 比赛状态较好,后面没有T6T6T6的题解 T1:abcT1:abcT1:abc 题目大意 给出一个字符串,求有多少个abc…

SpringBoot总结

一、SpringBoot (1)简介 SpringFramework:最重要的特征是依赖注入。所有 SpringModules 不是依赖注入就是 IOC 控制反转。使用 DI 或者是 IOC 的时候,可以开发松耦合应用。松耦合应用的单元测试可以很容易的进行。 Spring MVC&…

Metrics.net + influxdb + grafana 构建WebAPI的自动化监控和预警

前言这次主要分享通过Metrics.net influxdb grafana 构建WebAPI的自动化监控和预警方案。通过执行耗时,定位哪些接口拖累了服务的性能;通过请求频次,设置适当的限流和熔断机制,拦截非法或不合理的请求,保障服务的可用…

jzoj6342-[NOIP2019模拟2019.9.7]Tiny Counting【树状数组,容斥】

正题 题目大意 一个序列SSS&#xff0c;求有多少个互不相同的4元组(a,b,c,d)(a,b,c,d)(a,b,c,d)使得a<b且Sa<Sba<b且S_a<S_ba<b且Sa​<Sb​ c<b且Sc>Sdc<b且S_c>S_dc<b且Sc​>Sd​ 解题思路 若可以重复其实答案就是逆序对个数乘上正序对…

jzoj6343-[NOIP2019模拟2019.9.7]Medium Counting【记忆化dfs,dp】

正题 题目大意 给出nnn个字符串SiS_iSi​&#xff0c;然后有些???号可以进行随便填字母。 然后要求Si<Si1S_i<S_{i1}Si​<Si1​的情况下求方案数。 解题思路 定义fl,r,p,cf_{l,r,p,c}fl,r,p,c​表示只考虑l∼rl\sim rl∼r的字符串&#xff0c;只考虑ppp往后的字…

EF Core 2.1路线图:视图、GROUP BY和惰性加载

Entity Framework Core一直追随着初始Entity Framework的发展&#xff0c;并不断推陈出新。它首先推出的是对视图的支持&#xff0c;这听起来有些耸人听闻。在即将推出的EF Core 2.1之前&#xff0c;EF Core并未对数据库视图提供官方的支持&#xff0c;也不支持缺少主键的数据库…

计算机网络总结

一、计算机网络体系 &#xff08;1&#xff09;OSI分层 &#xff08;7层&#xff09; 物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。 &#xff08;2&#xff09;TCP/IP分层&#xff08;4层&#xff09; 网络接口层、 网际层、运输层、 应用层。 &#xff0…

从技术角度讨论微服务

本文希望从技术角度来探讨下微服务&#xff0c;因此&#xff0c;不会过多地谈及如何根据业务进行微服务划分&#xff0c;更多是介绍微服务的相关技术&#xff0c;微服务的业务划分方法可参考“领域驱动设计“相关方法论。微服务的两个程度一、服务化复杂的单体架构会有以下的挑…

jzoj6344-[NOIP2019模拟2019.9.7]Huge Counting【组合数,状压dp】

正题 题目大意 定义函数f(x)(xf(x)(xf(x)(x为一个序列))) 若任意一个xi1x_i1xi​1那么有f(x)1f(x)1f(x)1 若有一个xi0x_i0xi​0那么有f(x)0f(x)0f(x)0 其他的&#xff0c;有f(x)(∑j1nf(x1...,xj−1,...xn))%2f(x)(\sum_{j1}^nf(x_{1}...,x_j-1,...x_n))\% 2f(x)(j1∑n​f(x1​…

拥抱.NET Core系列:MemoryCache 缓存域

MSCache项目MSCache 目前最新的正式版是 2.0.0&#xff0c;预览版是2.1.0&#xff0c;会与 .NETCore 2.1 一起发布。本篇用了2.0.0版本开源在 GitHub 上&#xff0c;仓库地址是&#xff1a;https://github.com/aspnet/CachingNuGet地址为&#xff1a;https://www.nuget.org/pac…

牛客小白月赛17-记录(附题解)

正题 比赛链接:https://ac.nowcoder.com/acm/contest/1085#question 成绩 总结 除了那道积分数学其他还好 后面没有FFF题的题解 T1:小sun的假期T1:小sun的假期T1:小sun的假期 题目大意 长度为nnn的序列&#xff0c;mmm个区间&#xff0c;求最大的没有被任何区间覆盖的区间…

安全、高效的MySQL DDL解决方案

MySQL作为目前应用最广泛的开源关系型数据库&#xff0c;是许多网站、应用和商业产品的主要数据存储。在生产环境&#xff0c;线上数据库常常面临着持续的、不断变化的表结构修改&#xff08;DDL&#xff09;&#xff0c;如增加、更改、删除字段和索引等等。其中一些DDL操作在M…