![](https://img-blog.csdnimg.cn/20210727084900127.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
JVM
java虚拟机相关知识
shy_snow
这个作者很懒,什么都没留下…
展开
-
使用relocation解决包冲突导致的java.lang.LinkageError: loader constraint violation
自行编码jar后报错,看网上类似问题都是jar冲突,解决一般就是删除冲突的jar包对比正常版本和这次编译的版本发现pom.xml缺少了relocations相关内容。relocations是将制定目录的class移动到一个新的目录下面,从而避免冲突。 原来的包名 新的包名.........原创 2022-06-23 10:18:10 · 1327 阅读 · 0 评论 -
java -cp在jar中引用其他jar和目录下的驱动包
# 多个jar使用:分隔java -cp .:./DcJtcjFile.jar:./lib/mysql-connector-java-5.1.27.jar com.test.MainClient如果不想一个个指定,可以编写sh脚本将lib目录下的jar都拼接一下#!/bin/shBASEDIR=`dirname $0`cd $BASEDIRCLASSPATH=$BASEDIR# 优先加载外部配置文件config.propertiesCLASSPATH=$CLASSPATH:$BASE原创 2022-04-25 22:38:35 · 809 阅读 · 0 评论 -
根据类名找jar包findjar.com
将完整类名到https://www.findjar.com/搜索即可查找到所有匹配的class点击class会显示所有包含该class的jar原创 2022-03-09 16:03:14 · 1577 阅读 · 0 评论 -
JDK的bug导致Java文件删除不了,必须fgc
在windows系统下jdk无法释放已缓存的文件,导致文件无法删除,所以需要主动调用System.gc()原创 2021-12-31 15:34:35 · 739 阅读 · 0 评论 -
Apache Log4j2远程JNDI代码执行漏洞修复
漏洞简介Apache Log4j2远程代码执行漏洞当打印的日志含有${字符串时程序会使用lookup解析要打印的字符串,执行任意远程代码,框架没有做相应的过滤导致注入。官网2021/12/13最新下载的2.15.0声明已经修复该问题。Log4j – Apache Log4j Security Vulnerabilities影响范围Apache Log4j 2.x <=2.14.1 (官网2021/12/13最新下载的2.15.0中已经修复该问题)修复措施..原创 2021-12-15 08:52:39 · 3641 阅读 · 0 评论 -
java对象序列化与反序列化工具类
import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStre..原创 2021-09-09 10:37:00 · 540 阅读 · 0 评论 -
进程、lwp(轻量级进程)和Java线程的理解
进程:操作系统调度单元,数据结构为task_struck结构体,并且操作系统会为其分配资源(内存地址空间、打开的文件、挂起的信号、进程状态等)。所以进程是处于执行期的程序以及它所管理的资源的总称。lwp(轻量级进程):操作系统概念与进程具有同样的task_struck数据结构,其实也是进程,但是它可以共享内存资源,也有称它为线程的。Java线程:java内的对象Thread, 目前java对Thread的实现是通过1个Thread对应一个lwp来实现的。也就是要执行一个java线程就必须在操作系统里原创 2021-08-13 18:06:20 · 690 阅读 · 0 评论 -
jdbc驱动类加载直接指定线程上下文加载器加载
jdbc获取连接是这么写的,看下代码都干了什么,是如何把驱动类加载到jvm的。Class.forName是装载一个类并且对其进行实例化的操作。这里mysql驱动com.sql.Driver的静态方法把该驱动类对象注册到DriverManager中了,就是添加到registeredDrivers列表中,后面会再遍历获取已注册的驱动类;再看DriverManager.getConnection(conUrl, userName, password);这个是jdk自己的实现,可以看到是..原创 2021-08-11 11:14:36 · 305 阅读 · 0 评论 -
使用jsp页面查看jvm使用情况
把下面的jvm.jsp放到项目里就能在前台访问这个jsp来查看web后台的jvm内存使用情况jvm.jsp<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ page import="java.lang.management.*"%><%@ page import="java.util.*"%><!DOCTYPE html原创 2021-02-20 11:02:52 · 338 阅读 · 0 评论 -
jmap查看java进程占用的数据库连接数
jmap可以查看jvm中的对象数量,可以用来查看内存中创建的数据库连接对象的个数,从而判断jvm中已经创建的数据库连接。oracle的连接对象可以使用oracle.jdbc.driver.T4CConnection ,mysql的连接对象可以使用com.mysql.jdbc.JDBC4Connection一、oracle连接对象jmap -histo:live pid|grep oracle.jdbc.driver.T4CConnection.可以看到有166个oracle连接.原创 2020-11-25 11:41:47 · 3584 阅读 · 0 评论 -
静态代码块无法对静态变量赋值的原因
遇到一个静态代码块对静态变量赋值,居然无效。就像下面的代码,看到输出的还是默认值,内心是崩溃的。public class StaticLoad{ static { i=666; } static int i=1;// static {// i=1;// } public static void main(String[] args) { System.out.println(StaticLoad.i); }}突然想到这个不会和加载顺序有关吧,把赋值代码块移动到原创 2020-09-02 21:45:30 · 2062 阅读 · 1 评论 -
如何查看JVM内存中的对象和执行中的方法
本机debugger就好了,远程的可以远程debugger,内网生产无法远程debugger的怎么办?使用jmap和jstack将堆内存(对象)和栈(方法)输出为文件进行查看。pid:是jvm进程号,可以使用jps -ml或ps命令查看到jvm内存对象统计:jmap -histo:live pidjvm内存对象查看:先将内存导出为文件: jmap -dump:format=b,file=dump.hprof pid然后使用mat工具打开查看里面有多个统计...原创 2020-09-01 12:58:58 · 6064 阅读 · 0 评论 -
JVM运行时内存概念-堆栈及新生代、老年代、持久代
JVM内存有一些按不同标准划分的概念,这里来理清一下。一、首先java虚拟机规范定义了java运行时数据区在概念上应该有的分区,这是抽象概念不对应也不限制物理上的具体实现,不同的虚拟机可以有不同的实现,但是在抽象上必须要有这些区。二、说完了逻辑概念,再说虚拟机实现,在实现虚拟机的时候,考虑垃圾回收效率,将JVM内存划分为三块:元数据区,老年代,新生代;注意这里的分代概念和运行时数据区是两个不同层次和标准的概念,是两套概念。使用jvisualvm.exe安装Visual GC插件后可以查看原创 2020-06-17 12:48:57 · 606 阅读 · 0 评论 -
jvisualvm离线安装visualgc插件
离线下载地址https://visualvm.github.io/pluginscenters.html根据你jdk的版本选择对应的插件,我的1.8下载地址https://visualvm.github.io/archive/uc/8u20/updates.html工具-->插件-->已下载-->添加插件选中下载的离线插件包,安装完成...原创 2019-10-29 16:43:48 · 998 阅读 · 0 评论 -
用户线程和守护线程(服务线程)
package com.iteye.yuanyuan7891.thread.DaemonTest;import java.lang.management.GarbageCollectorMXBean;import java.lang.management.LockInfo;import java.lang.management.ManagementFactory;import java...原创 2019-10-28 10:03:53 · 228 阅读 · 0 评论 -
java的class文件魔数和版本对应关系
使用十六进制编辑器打开class查看,CAFEBABE为class文件魔数,后面4个字节是版本号原创 2019-07-12 15:30:43 · 540 阅读 · 0 评论 -
多线程安全小结-可见性(内存屏障,共享变量副本)、原子性、有序性(编译器优化、cpu流水线乱序)
摘要:java多线程安全要满足:原子性、可见性、有序性。手段有:不共享;不可变状态对象;互斥锁;同步工具类;线程安全工具类本文为本人阅读《Java并发编程实战》的理解和总结,java多线程安全性基础介绍.pptx多线程知识前提 什么是线程 线程 任务(调度运行,run()代码执行)和资源(cpu时间,内存)的抽象 线程是CPU调度的基本单位 实...原创 2018-10-17 18:43:20 · 585 阅读 · 0 评论 -
GC overhead limit exceeded
"GC overhead limit exceeded"表示JVM垃圾收集一直在运行导致应用运行缓慢。在垃圾收集后,如果Java进程花费大约超过98%的时间来进行GC且恢复不到2%的堆内存,就会抛出java.lang.OutOfMemoryError异常,一般是因为大量运行时数据被勉强填充到了堆内存中。解决办法:增加堆内存,使用-XX:-UseGCOverheadLimit参数关闭这个限制。...原创 2019-04-19 10:11:33 · 10619 阅读 · 0 评论 -
java.lang.OutOfMemoryError内存溢出定位
OM内存溢出定位增加异常时记日志参数 -XX:+HeapDumpOnOutOfMemoryError 该参数在JVM内存溢出时会记录堆转储文件java_pid%p.hprof。(%p为进程号) -XX:HeapDumpPath=/tmp/dump 该参数设置堆转储文件保存的目录。 GC分析 查看JVM的设置 jps -v|grep pid ...原创 2018-02-09 23:55:44 · 792 阅读 · 1 评论 -
JVM内存分配与垃圾回收
其实已经有很多大牛在这方面做了很好的介绍,我在这篇文章里讲下我自己的一些理解,受限于我的认知水平,可能不一定正确,请自我甄别。 JVM的GC自动垃圾回收器是JAVA的一大特色,垃圾回收器要解决三大问题:where(去哪里回收垃圾)、what(对象是不是垃圾)、how(如何回收垃圾)。问题一、WHERE要了解垃圾回收必须了解JVM内存分配。JVM像其他程序一样也是一个软...原创 2018-04-27 12:07:31 · 577 阅读 · 0 评论 -
jstack会导致JVM停顿
在一次频繁GC导致的cpu飙高(16个gc线程每个使用cpu100%,cpu使用1600%)的定位中发现每次jstack打印堆栈的时候cpu就会下降到100%(图中红色的深谷)。说明jstack命令会导致JVM停顿,16个gc线程肯定都停了,应该只有一个jstack相关的线程在工作。红色是cpu...原创 2019-04-07 03:34:10 · 2561 阅读 · 0 评论