JDK基础
JDK基础,原理,使用
三侠剑
技术狂人
展开
-
JDK安装
【代码】JDK安装。原创 2023-03-06 19:32:41 · 104 阅读 · 1 评论 -
centos 7中sudo java : command not found
运行sudo java -version报错$ sudo java -versionsudo: java:找不到命令原因:当使用sudo去执行一个程序时,处于安全的考虑,这个程序将在一个新的、最小化的环境中执行,诸如PATH这样的环境变量,在sudo命令下已经被重置成默认状态了。所以当一个刚初始化的PATH变量中不包含你所要运行的程序所在的目录,用sudo去执行,你就会得到"command not found"的错误提示。查看sudo指令下的PATH变量:$ sudo printe转载 2021-09-03 16:26:56 · 933 阅读 · 0 评论 -
TLAB的补充说明
在HotSpot VM里,TLAB只有在“分配”这个动作上是线程独占的,而在使用/收集意义上都还是让所有线程共享的;使用上的共享并不需要做任何额外检查。HotSpot VM目前并没有实现单独收集一个线程的TLAB的GC(这种GC叫做thread-local GC或者缩写为TLGC)。如果实现TLGC,那么TLGC可以看作比minor GC(或者叫Young GC)更轻量的一种GC,只需要暂停当前线程去收集该线程独占的部分的堆,而不需要暂停任何其它Java线程。看似很诱人对不对?请往后面读下去。所谓TLA原创 2020-11-22 16:33:08 · 434 阅读 · 0 评论 -
jvm G1 深度分析
https://zhuanlan.zhihu.com/p/96047595一,垃圾回收简介首先,在了解G1之前,我们需要清楚的知道,垃圾回收是什么?简单的说垃圾回收就是回收内存中不再使用的对象。垃圾回收的基本步骤回收的步骤有2步:查找内存中不再使用的对象释放这些对象占用的内存1,查找内存中不再使用的对象那么问题来了,如何判断哪些对象不再被使用呢?我们也有2个方法:引用计数法引用计数法就是如果一个对象没有被任何引用指向,则可视之为垃圾。这种...转载 2020-11-13 23:30:24 · 1258 阅读 · 0 评论 -
oopmap和卡表和三色标记
都是gcroot阶段,对应收集器的初始标记阶段。oopmap是栈用,对应的是安全点,安全区域;卡表是堆内用,youngGC时避免扫描老年代而生,通过写屏障记录引用变化;(g1是双向卡表,记录的是跨region引用)三色标记对应的gcroot完成后的可达性分析阶段,理论上对应cms收集器的并发标记,重新标记阶段,对应g1并发标记,最终标记阶段...原创 2020-10-24 07:30:25 · 520 阅读 · 0 评论 -
Getting Started with the G1 Garbage Collector
Getting Started with the G1 Garbage CollectorOverviewPurposeThis tutorial covers the basics of how to use the G1 garbage collector and how it can be used with the Hotspot JVM. You will learn how the G1 collector functions internally, the key co..转载 2020-11-12 16:02:11 · 1004 阅读 · 0 评论 -
JVM之对象分配:栈上分配 & TLAB分配
1. Java对象分配流程 2. 栈上分配 2.1 本质:Java虚拟机提供的一项优化技术 2.2 基本思想: 将线程私有的对象打散分配在栈上 2.3 优点: 2.3.1 可以在函数调用结束后自行销毁对象,不需要垃圾回收器的介入,有效避免垃圾回收带来的负面影响 2.3.2 栈上分配速度快,提高系统性能 2.4 局限性: 栈空间小,对于大对象无法实现栈上分配 2.4 技术基础: 逃逸分析 2.4....转载 2020-11-08 00:01:57 · 625 阅读 · 0 评论 -
逃逸分析和栈上分配概念
了解逃逸分析和栈上分配之前,我们可以先简单了解一下它们的基本定义。逃逸分析(个人理解):就是方法内的对象,可以被方法外所访问。方法逃逸的方式如下:public class EscapeTest {public static Object obj;public void globalVariableEscape() {// 给全局变量赋值,发生逃逸obj = new Object(); }public Object methodEscape() {// 方法返回值,发生逃转载 2020-11-07 23:27:42 · 312 阅读 · 0 评论 -
java字节码框架ASM的学习
一、什么是ASM ASM是一个java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。 使用ASM框架需要导入asm的jar包,下载链接:.转载 2020-11-01 22:00:52 · 831 阅读 · 0 评论 -
CGLib与ASM
CGLib (Code Generation Library) 是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。Hibernate用它来实现PO字节码的动态生成。CGLib 比 Java 的 java.lang.reflect.Proxy 类更强的在于它不仅可以接管接口类的方法,还可以接管普通类的方法。CGLib 的底层是Java字节码操作框架 ——ASM。ASM是一个通用的Java字节码操作和分析框架。 它可以用于修改现有类或直接以二进制形式动态生.原创 2020-11-01 21:52:31 · 1353 阅读 · 0 评论 -
浅谈CPU、内存,硬盘三者关系
随着SSD的发展,只要电脑一卡顿,人们会第一想的是换SSD就可以升级电脑性能,其实不尽然。电脑卡顿跟固态硬盘固然有关系,但是它跟CPU和内存条的关系也很多,接下来带大家了解下三者之间的关系。 CPU是一块超大规模的集成电路,是一台计算机的运算核心和控制核心。它的功能主要是解释计算机指令以及处理计算机软件中的数据。计算机的性能在很大程度上由CPU的性能决定,而CPU的性能主要体现在其运行程序的速度上。影响运行速度的性能指标包括CPU的工作频率、Cache容量、指令系统和逻辑结构等参数。而内存是计算机.转载 2020-10-31 22:28:26 · 2221 阅读 · 0 评论 -
虚拟机基于寄存器基于栈的概念和区别
基于寄存器与基于栈的虚拟机什么是虚拟机虚拟机是借助于操作系统对物理机器的一种模拟。但是我们今天所讲述的虚拟机概念比较狭义,与vmware或者virtual-box不同,而是针对具体语言所实现的虚拟机。例如在JVM或者CPython中,JAVA或者python源码会被编译成相关字节码,然后在对应虚拟机上运行,JVM或CPython会对这些字节码进行取指令,译码,执行,结果回写等操作,这些步骤和真实物理机器上的概念都很相似。相对应的二进制指令是在物理机器上运行,物理机器从内存中取指令,通过总线传输到CP转载 2020-10-31 21:19:30 · 2482 阅读 · 1 评论 -
垃圾收集器之:G1收集器
垃圾收集器之:G1收集器G1垃圾收集器是一种工作在堆内不同分区上的并发收集器。分区既可以归属于老年代,也可以归属新生代,同一个代的分区不需要保持连续。为老年代设计分区的初衷是我们发现并发后台线程在回收老年代中没有引用的对象时,有的分区垃圾对象的数量很多,另一些分区垃圾对象相对较少。虽然分区的垃圾收集工作实际还是要暂停应用线程,不过由于G1收集器专注于垃圾最多的分区,最终的效果是花费较少的时间就能回收这些分区的垃圾。这种只专注于垃圾最多的分区的方式就是G1垃圾收集器的名称由来,即首先收集垃圾最多的分区转载 2020-10-30 17:24:11 · 270 阅读 · 0 评论 -
jvm 性能调优工具之 jinfo
概述jinfo 是 JDK 自带的命令,可以用来查看正在运行的 java 应用程序的扩展参数,包括Java System属性和JVM命令行参数;也可以动态的修改正在运行的 JVM 一些参数。当系统崩溃时,jinfo可以从core文件里面知道崩溃的Java应用程序的配置信息jinfo 用法参数说明pid 对应jvm的进程id executable core 产生core dump文件 [server-id@]remote server IP or hostname 远程的ip或者hos转载 2020-10-30 15:08:10 · 422 阅读 · 0 评论 -
内存中的对象存储布局,占用字节数
一 基本类别Java一共有8种基本数据类型(原始数据类型) :(第一个位是符号位)类型 存储要求 范围(包含) 默认值 包装类整 int 4字节(32位) -2^31~ 2^31-1 0 Integer数 short 2字节(16位) -2^15~2^15-1 0 Short类 long 8字...原创 2020-10-30 14:18:20 · 313 阅读 · 0 评论 -
局部变量表变量槽重用测试
public static void main(String[] args) { { String[] f = new String[64*1024*1024]; } System.gc(); }运行参数加上 -verbose:gc 查看GC情况超出作用域因没有其他变量,所以未被重用,收集器不敢回收使用中的变量public static void main(String[] args) { { String[] f = new String[64*...原创 2020-10-30 10:19:05 · 139 阅读 · 0 评论 -
javap命令实践
1. javap CheckPlazaRegionUtil.class //显示类的基本信息public class com..domain.util.CheckPlazaRegionUtil { public com..domain.util.CheckPlazaRegionUtil(); public static boolean checkRegion(java.lang.String); public static boolean checkPlaza(java.lang.Str...原创 2020-10-28 12:57:56 · 247 阅读 · 0 评论 -
我对OopMap,安全点,安全区域的理解
一、oopMapoop (ordinary object pointer) 普通对象指针,oopmap就是存放这些指针的map,OopMap 用于枚举 GC Roots,记录栈中引用数据类型的位置。迄今为止,所有收集器在根节点枚举这一步骤都是必须暂停用户线程的,收集线程会对栈上的内存进行扫描,看看哪些位置存储了Reference类型。如果发现某个位置确实存的是Reference类型,它所引用的对象这一次不能被回收。问题是,栈上的本地变量表里面只有一部分数据是Reference类型的,那些非Refer原创 2020-10-23 21:28:56 · 3264 阅读 · 5 评论 -
GC两个关键难点:跨代引用与并发标记
在分析JVM的分代垃圾收集算法的时候,可能存在老年代对新生代的引用,无法真正确定对象已死。一、解决跨代引用:记忆集记忆集(Remembered Set):一种用于记录从非收集区域指向收集区域的指针集合的抽象数据结构,在对象层面来说就是非收集区域对象对收集区域对象的引用的记录。它存放在收集区域,比如在新生代里面存放着老年代对新生代对象的每一个引用。这样在收集新生代的时候,我们就可以根据记忆集知道哪些对象被老年代对象所引用,不能回收,这就解决了跨代引用的问题。记忆集根据记录的精度分三类:字长转载 2020-10-22 21:43:06 · 353 阅读 · 0 评论 -
JVM(hotspot)为什么使用元空间替换了永久代
一、我们先来理解两个概念:规范和实现《Java虚拟机规范》方法区和堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。方法区是一种规范,不同的虚拟机厂商可以基于规范做出不同的实现,永久代和元空间就是出于不同jdk版本的实现jdk7之前hotspot用永久代(非堆,但是虚拟机中)实现了方法区,jdk8改为了使用元空间(元空间并不在虚拟机中,而是使用本地内存)。字符串常量移至Java Heap。32 位机器默认的永久代的大小为 64原创 2020-10-17 13:14:52 · 986 阅读 · 1 评论 -
64位机器支持的最大内存
理论上:32位=2^32B = 4 * 2^30B = 4GB,这是 32 位单进程内存上限 64位=2^48B = 2^40* 2^8 = 256T原创 2020-10-17 11:50:11 · 3192 阅读 · 1 评论 -
jdk官网及说明
OpenJDK官方地址:http://openjdk.java.netOracleJDK官方地址:https://www.oracle.com/technetwork/java/javase/downloads/index.html源码下载:https://hg.openjdk.java.net/jdk/jdk15点击zip下载,点击browse查看目录原创 2020-10-15 21:36:46 · 42803 阅读 · 0 评论 -
JVM heap dump生成及分析
一、heapdump文件介绍heap dump: heap dump文件是一个二进制文件,它保存了某一时刻JVM堆中对象使用情况。HeapDump文件是指定时刻的Java堆栈的快照,是一种镜像文件。产生heap dump(内存溢出)错误原因一般出于以下原因:1)JVM内存过小,2)程序不严密,3)产生过多的垃圾无法回收。二、heapdump文件如何生成?2.1)使用 jmap 命令生成: jmap 命令是JDK提供的用于生成堆内存信息的工具,切换到JDK_HOME...转载 2020-09-29 23:40:46 · 9444 阅读 · 1 评论 -
jstat命令使用
jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。命令的格式如下:jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数]注意:使用的jdk版本是jdk8.类加载统计:jstat-class2060 LoadedBytesUnloadedBytesTime 1575617355.600.011.29Loaded:加载class的数量 Bytes:所占用空间大小 Unload...转载 2020-09-01 23:10:59 · 128 阅读 · 0 评论 -
Full GC(Heap Inspection Initiated GC)
2020-09-01T15:13:19.041+0800: 91164.506: [Full GC (Heap Inspection Initiated GC) 1380M->195M(4096M), 1.4889058 secs] [Eden: 1136.0M(2410.0M)->0.0B(2456.0M) Survivors: 46.0M->0.0B Heap: 1380.3M(4096.0M)->195.4M(4096.0M)], [Metaspace: 93789...原创 2020-09-01 15:21:51 · 2931 阅读 · 0 评论 -
查看jvm内存使用情况方法
1)jinfo -flags pid 查询虚拟机运行参数信息。2)jinfo -flag name pid,查询具体参数信息。3)jmap -heap pid:输出堆内存设置和使用情况(JDK11使用jhsdb jmap --heap --pid pid)4)jmap -histo pid:输出heap的直方图,包括类名,对象数量,对象占用大小5)jmap -histo:live pid:同上,只输出存活对象信息6)jmap -clstats pid:输出加载类信息7)jmap -h原创 2020-08-31 19:43:52 · 8197 阅读 · 0 评论 -
java -server -jar 启动
java -server -Xmx4G -Xms4G -XX:MaxMetaspaceSize=384M -XX:MetaspaceSize=384M -XX:+UseG1GC -XX:MaxGCPauseMillis=500 -XX:+ParallelRefProcEnabled -XX:+DoEscapeAnalysis -XX:+EliminateAllocations -XX:+EliminateLocks -XX:ErrorFile=./tmp/hs_err_pid%p.log -Xloggc:.原创 2020-08-30 19:26:22 · 2835 阅读 · 0 评论 -
jvm常用名词
STWStop-The-World是在执行垃圾收集算法时,Java应用程序的其他所有线程都被挂起(除了垃圾收集帮助器之外)。Java中一种全局暂停现象,全局停顿,所有Java代码停止,native代码可以执行,但不能与JVM交互;这些现象多半是由于gc引起。...原创 2020-08-30 13:13:58 · 177 阅读 · 0 评论 -
G1,S0一直是0,S1一直100
因为G1的堆布局跟HotSpot VM里其它GC不一样——它只有一组逻辑上的survivor space,而不像其它HotSpot GC一样有两段明确、固定的地址空间用作survivor space——所以用jstat看G1的话肯定是survivor space 0显示0%,survivor space 1显示100%。这个是正常的。G1在初始化jstat用的计数器的时候就指定了s0永远是0:_from_counters=newHSpaceCounters("s0",1/*or...原创 2020-08-30 12:58:28 · 5152 阅读 · 0 评论 -
G1简介及日志讲解
gc.log常见日志及分析:GC pause (G1 Evacuation Pause)— 疏散停顿(Evacuation Pause)是将活着的对象从一个区域(young or young + old)拷贝到另一个区域的阶段(young)— 表示这是一个 Young GC 事件GC Workers: 23– 表示 GC 的工作线程是 23个。real=0.02 secs– 注意这里的real时间,它表示 GC 总共花了 0.02 秒eden回收后,空间增长到...原创 2020-08-30 12:38:18 · 2128 阅读 · 0 评论 -
OOM后解决问题步骤
1. 服务实时记录gc日志-Xloggc:./tmp/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps2. jstat 查看当前堆的空间情况3. 导出dump文件jmap -dump:format=b,file=serviceDump.dat pid4. 分析dump文件C:\Program Files\Java\jdk1.8.0_141\bin\jvisualvm.exe也可以用eclipse工具5. 根据实际情况,调优.原创 2020-08-31 19:32:01 · 282 阅读 · 0 评论 -
GC日志生成-Xloggc,GC情况实时查看命令jstat
生成日志 -Xloggc:./tmp/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps-XX:+PrintGC 输出GC日志-XX:+PrintGCDetails 输出GC的详细日志-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)-XX:+PrintHeapA...原创 2020-08-27 23:36:51 · 9086 阅读 · 0 评论