首页
归档
留言
友链
广告合作
壁纸
更多
美女主播
Search
1
博瑞GE车机升级/降级
5,572 阅读
2
Mac打印机设置黑白打印
4,884 阅读
3
修改elementUI中el-table树形结构图标
4,861 阅读
4
Mac客户端添加腾讯企业邮箱方法
4,642 阅读
5
intelliJ Idea 2022.2.X破解
4,313 阅读
Java
HarmonyOS Next
Web前端
微信开发
开发辅助
App开发
数据库
随笔日记
登录
/
注册
Search
标签搜索
Spring Boot
Java
Spring Cloud
Mac
MyBatis
WordPress
Nacos
Spring Cloud Alibaba
Mybatis-Plus
jQuery
MacOS
Java Script
asp.net
MySQL
IntelliJ IDEA
微信小程序
Typecho
Sentinel
UniApp
asp.net core
Laughing
累计撰写
612
篇文章
累计收到
1,427
条评论
首页
栏目
Java
HarmonyOS Next
Web前端
微信开发
开发辅助
App开发
数据库
随笔日记
页面
归档
留言
友链
广告合作
壁纸
美女主播
搜索到
34
篇与
的结果
2021-07-31
JVM故障诊断与性能优化之常用虚拟机参数
类加载子系统负责从文件系统或网络中加载Class信息。方法区存放类加载子系统加载的Class信息及运行时常量池信息,包括字符串的字面量和数字常量Java堆在虚拟机启动时建立,是Java程序最主要的内存工作区域,几乎所有的Java对象实例都放于Java堆中。堆空间是线程共享的。直接内存直接内存是在Java堆外直接向系统申请的内存空间,通常,访问直接内存的速度会优于Java堆。因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存。直接内存在Java堆外,因此它的大小不会直接首先与Xmx指定的最大堆大小。垃圾回收系统垃圾回收器可以堆方法区、Java堆和直接内存进行回收。Java栈每个一Java虚拟机线程都有一个私有的Java栈,一个线程的Java栈在线程创建的时候被创建,Java栈中保存着局部变量、方法参数,同时和Java方法的调用、返回密切相关。本地方法栈与Java栈类似,最大的不同在于Java栈用于Java方法的调用,而本地方法栈用于本地方法的调用。作为Java虚拟机的重要扩展,Java虚拟机允许Java直接调用本地的方法(通常使用C编写)PC寄存器寄存器也是每个线程私有的空间,Java虚拟机会为每一个Java线程创建PC寄存器,在任意时刻,一个Java线程总是在执行一个方法,这个正在被执行的方法称为当前方法。如果当前方法不是本地方法,PC寄存器就会只想当前正在被执行的指令,如果当前方法是本地方法,那么PC寄存器的值就是undefined执行引擎负责执行虚拟机的字节码。常见Java虚拟机参数要诊断虚拟机,我们就要学习如何对Java虚拟机进行最基本的配置和跟踪。跟踪垃圾回收可以通过-XX:+PrintGC参数启动Java虚拟机,只要遇到GC,就会打印日志。System.out.println("##########准备申请1m内存#########"); byte[] bytes = new byte[1 * 1024 * 1024]; System.gc();GC和Full GC是垃圾回收的停顿类型,而不是区分是新生代还是年老代,如果有Full说明发生了Stop-The-World。如果是调用 System.gc()触发的,那么将显示的是Full GC (System) 4878K->1576K(249344K)表示GC 前该区域已使用容量 -> GC 后该区域已使用容量 (该区域内存总容量)0.0013118 secs表示GC所用时间,单位为秒。可以通过-XX:+PrintGCDetails参数来输出更加详细的参数。PSYoungGen:代表新生代。total 75776K, used 1951K代表新生代大小及已使用大小。[0x000000076b800000, 0x0000000770c80000, 0x00000007c0000000)代表新生代的下界、当前上界和上届。eden、from、to代表新生代的三个区,当对象在 Eden ( 包括一个 Survivor 区域,这里假设是 from 区域 ) 出生后,在经过一次 Minor GC 后,如果对象还存活,并且能够被另外一块 Survivor 区域所容纳( 上面已经假设为 from 区域,这里应为 to 区域,即 to 区域有足够的内存空间来存储 Eden 和 from 区域中存活的对象 ),则使用复制算法将这些仍然还存活的对象复制到另外一块 Survivor 区域 ( 即 to 区域 ) 中,然后清理所使用过的 Eden 以及 Survivor 区域 ( 即 from 区域 ),并且将这些对象的年龄设置为1,以后对象在 Survivor 区每熬过一次 Minor GC,就将对象的年龄 + 1,当对象的年龄达到某个值时 ( 默认是 15 岁,可以通过参数-XX:MaxTenuringThreshold 来设定 ),这些对象就会成为老年代。ParOldGen代表老年代
2021年07月31日
599 阅读
0 评论
0 点赞
2021-06-06
Java线程间的通信之等待/通知机制
上⾯⼀种基于“锁”的⽅式,线程需要不断地去尝试获得锁,如果失败了,再继续尝试。这可能会耗费服务器资源。⽽等待/通知机制是另⼀种⽅式。Java多线程的等待/通知机制是基于Object类的wait()⽅法和notify(),notifyAll()⽅法来实现的。[alt type="success"]notify()⽅法会随机叫醒⼀个正在等待的线程,⽽notifyAll()会叫醒所有正在等待的线程。[/alt]前⾯我们讲到,⼀个锁同⼀时刻只能被⼀个线程持有。⽽假如线程A现在持有了⼀个锁lock并开始执⾏,它可以使⽤lock.wait() 让⾃⼰进⼊等待状态。这个时候,lock这个锁是被释放了的。这时,线程B获得了lock这个锁并开始执⾏,它可以在某⼀时刻,使⽤lock.notify(),通知之前持有lock锁并进⼊等待状态的线程A,说“线程A你不⽤等了,可以往下执⾏了”。[alt type="warning"]需要注意的是,这个时候线程B并没有释放锁lock,除⾮线程B这个时候使⽤lock.wait()释放锁,或者线程B执⾏结束⾃⾏释放锁,线程A才能得到lock锁。[/alt]package com.company; import java.util.stream.IntStream; public class WaitAndNotify { private static Object lock = new Object(); static class ThreadA implements Runnable{ @Override public void run() { synchronized (lock){ IntStream.range(1,5).forEach(i->{ System.out.println("ThreadA:"+i); lock.notify(); try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } }); } } } static class ThreadB implements Runnable{ @Override public void run() { synchronized (lock){ IntStream.range(1,5).forEach(i->{ System.out.println("ThreadB:"+i); lock.notify(); try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } }); } } } public static void main(String[] args) throws InterruptedException { new Thread(new ThreadA()).start(); Thread.sleep(1000); new Thread(new ThreadB()).start(); } } [alt type="info"]需要注意的是等待/通知机制使⽤的是使⽤同⼀个对象锁,如果你两个线程使⽤的是不同的对象锁,那它们之间是不能⽤等待/通知机制通信的。[/alt]
2021年06月06日
867 阅读
0 评论
1 点赞
2021-06-06
Java线程间的通信之锁与同步
在Java中,锁的概念都是基于对象的,所以我们⼜经常称它为对象锁。线程和锁的关系,我们可以⽤婚姻关系来理解。⼀个锁同⼀时间只能被⼀个线程持有。也就是说,⼀个锁如果和⼀个线程“结婚”(持有),那其他线程如果需要得到这个锁,就得等这个线程和这个锁“离婚”(释放)。在我们的线程之间,有⼀个同步的概念。什么是同步呢,假如我们现在有2位正在抄暑假作业答案的同学:线程A和线程B。当他们正在抄的时候,⽼师突然来修改了⼀些答案,可能A和B最后写出的暑假作业就不⼀样。我们为了A,B能写出2本相同的暑假作业,我们就需要让⽼师先修改答案,然后A,B同学再抄。或者A,B同学先抄完,⽼师再修改答案。这就是线程A,线程B的线程同步。可以以解释为:线程同步是线程之间按照⼀定的顺序执⾏。为了达到线程同步,我们可以使⽤锁来实现它。我们先来看看⼀个⽆锁的程序:package com.company; import java.util.stream.IntStream; public class NoneLock { static class ThreadA implements Runnable { @Override public void run() { IntStream.range(1, 100).forEach(i -> { System.out.println("threadA:" + i); }); } } static class ThreadB implements Runnable { @Override public void run() { IntStream.range(1, 100).forEach(i -> { System.out.println("threadB:" + i); }); } } public static void main(String[] args) { new Thread(new ThreadA()).start(); new Thread(new ThreadB()).start(); } } 某次的运行结果那我现在有⼀个需求,我想等A先执⾏完之后,再由B去执⾏,怎么办呢?最简单的⽅式就是使⽤⼀个“对象锁”:package com.company; import java.util.stream.IntStream; public class ObjectLock { private static final Object lock = new Object(); static class ThreadA implements Runnable { @Override public void run() { synchronized (lock) { IntStream.range(1, 100).forEach(i -> { System.out.println("threadA:" + i); }); } } } static class ThreadB implements Runnable { @Override public void run() { synchronized (lock) { IntStream.range(1, 100).forEach(i -> { System.out.println("threadB:" + i); }); } } } public static void main(String[] args) throws InterruptedException { new Thread(new ThreadA()).start(); Thread.sleep(10); new Thread(new ThreadB()).start(); } }
2021年06月06日
911 阅读
0 评论
0 点赞
2020-12-28
java8 list统计(求和、最大、最小、平均)
list.stream().mapToDouble(User::getHeight).sum()//和list.stream().mapToDouble(User::getHeight).max()//最大list.stream().mapToDouble(User::getHeight).min()//最小list.stream().mapToDouble(User::getHeight).average()//平均值
2020年12月28日
1,278 阅读
0 评论
0 点赞
2020-11-20
Java金额格式化去掉小数点后不需要的零
平时我们在开发过程中,金额一般都是格式化成特定位数,比如人民币金额一般格式化成10.25元这种,但是有时候,我们在打印一些小数时,不希望显示小数点后无用的0,比如3.20输出3.2,这时候就需要使用NSFormat类了。 BigDecimal bigDecimal = new BigDecimal("3.20"); NumberFormat numberFormat = NumberFormat.getInstance(); System.out.println(numberFormat.format(bigDecimal));
2020年11月20日
1,566 阅读
0 评论
0 点赞
2020-09-26
Mac查看已安装的jdk版本以及目录
最近学习https,想着借助java自带的keytool配置一下springboot的htts,因为需要进入%java_home%/bin。查看java目录命令如下/usr/libexec/java_home -V
2020年09月26日
1,518 阅读
0 评论
1 点赞
2019-07-10
修改tomcat配置映射去掉URL中的项目名
Tomcat文件目录conf/server.xml:host节点下添加<Context path="" docBase="projectname" debug="0" reloadable="true"/> 注意:在项目部署了以后在修改,修改了以后重启tomcat,修改了以后会影响到tomcat的控制台页面的运行 <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context path="" docBase="projectname" debug="0" reloadable="true"/> </host>
2019年07月10日
1,269 阅读
0 评论
0 点赞
2018-04-01
Mac下IntelliJ IDEA使用Tomcat报error=13, permission denied
打开Terminal,找到catalina.sh所在的文件夹下;输入chmod a+x catalina.sh即可
2018年04月01日
1,482 阅读
0 评论
1 点赞
2017-11-13
jsp包含页面的方法
在jsp中,我们可以通过两种方式包含页面,简单点的方法是包含一个或者几个静态页面,稍微高级一点的方式是包含动态页面,甚至像动态页面传递参数,下面我们针对这两种方式分别进行介绍。包含静态页面这里所谓的静态页面其实有点不太合适,我们也可以包含jsp页面,但是无法传递参数。包含静态页面通过<%@include file="" %>指令进行的。需要包含的页面index.jsp<%@include file="include.jsp" %> 被包含的页面include.jsp<h1>Include Page</h1> <h2><%=request.getParameter("included") %></h2>我们可以看一下下面的输出页面,由于无法传递参数,所以我们在页面获取的request的参数值是null包含动态页面并传递参数继续我们刚才的代码,我们修改index.jsp代码如下<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" session="true" isThreadSafe="true" autoFlush="true" info="我是首页" errorPage="errorPage.jsp"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>首页</title> </head> <body> <form action="index.jsp" name="form1" method="post"> <input type="text" name="userName" id="UserName"> <input type="submit" value="提交"> <% request.setCharacterEncoding("UTF-8"); String userName = request.getParameter("userName"); if(userName==null){ out.println("请输入用户名"); }else if(userName==""){ out.println("(づ ̄3 ̄)づ╭❤~,输入名称呀"); } else{ out.println(userName); } %> <%-- 注释 <%@include file="include.jsp" %> --%> <jsp:include page="include.jsp"> <jsp:param value="我被成功包含进来了" name="included"/> </jsp:include> </form> </body> </html>
2017年11月13日
1,222 阅读
0 评论
1 点赞
2017-11-11
JSP标签
JSP标签库,是使用XML语法格式完成程序操作的一种方法,其使用的语法类似于JavaBean的使用语法,于JavaBean一样,都可以通过类完成复杂的操作,而且最大的优势就是按照HTML标签的形式标签,这样可以方便的处理JSP页面的数据显示。定义空标签继承TagSupport类package me.lisen.JavaEEStudy; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; public class HelloTag extends TagSupport { @Override public int doStartTag() throws JspException { JspWriter jspWriter = super.pageContext.getOut(); try{ jspWriter.write("<h1>Hello,World!</h1>"); }catch (Exception e){ e.printStackTrace(); } return TagSupport.SKIP_BODY;//表示标签体为空 } }定义标签描述文件 /WEB-INF/hellotag.tld<?xml version="1.0" encoding="ISO-8859-1"?> <taglib xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd" version="2.1"> <tlib-version>1.0</tlib-version> <short-name>firsttag</short-name> <uri>https://lisen.cc</uri> <!-- Invoke 'Generate' action to add tags or functions --> <tag> <name>hello</name> <tag-class>me.lisen.JavaEEStudy.HelloTag</tag-class> <body-content>empty</body-content> </tag> </taglib>使用标签<%@ page import="java.awt.*" %> <%@ page import="java.util.ArrayList" %><%-- Created by IntelliJ IDEA. User: lisen Date: 2017/11/10 Time: 下午12:43 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@page import="me.lisen.JavaEEStudy.Dpt" %> <%@taglib prefix="mytag" uri="/WEB-INF/hellotag.tld" %><%--定义标签--%> <html> <head> <title>首页</title> <script src="js/jquery-3.2.1.js" type="text/javascript"></script> <script src="css/bootstrap/js/bootstrap.js" type="text/javascript"></script> <link href="css/bootstrap/css/bootstrap.css" rel="stylesheet"> <script src="js/bootstrap-fileinput/js/fileinput.js" type="text/javascript"></script> <link href="js/bootstrap-fileinput/css/fileinput.css" rel="stylesheet"> <script src="js/bootstrap-fileinput/js/locales/zh.js" type="text/javascript"></script> </head> <body> <mytag:hello/><%--使用标签--%> </body> </html>如果标签描述文件的路径比较深,我们通过修改web.xml修改映射,然后调用对应的uri获取标签描述文件的位置首先,我们修改web.xml文件,对标签描述文件进行映射<jsp-config> <taglib> <taglib-uri>hellotagtld</taglib-uri> <taglib-location>/WEB-INF/hellotag.tld</taglib-location> </taglib> </jsp-config>修改标签引用的uri<%@taglib prefix="mytag" uri="hellotagtld" %><%--定义标签--%> 定义一个有属性的标签。修改继承的类package me.lisen.JavaEEStudy; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; import java.text.SimpleDateFormat; import java.util.Date; public class HelloTag extends TagSupport { private String formatStr; public void setFormatStr(String formatStr) { this.formatStr = formatStr; } public String getFormatStr() { return formatStr; } @Override public int doStartTag() throws JspException { JspWriter jspWriter = super.pageContext.getOut(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat(formatStr); try{ jspWriter.write(simpleDateFormat.format(new Date())); }catch (Exception e){ e.printStackTrace(); } return TagSupport.SKIP_BODY;//表示标签体为空 } }修改tld文件,加入定义的属性<?xml version="1.0" encoding="ISO-8859-1"?> <taglib xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd" version="2.1"> <tlib-version>1.0</tlib-version> <short-name>firsttag</short-name> <uri>https://lisen.cc</uri> <!-- Invoke 'Generate' action to add tags or functions --> <tag> <name>hello</name> <tag-class>me.lisen.JavaEEStudy.HelloTag</tag-class> <body-content>empty</body-content> <attribute> <name>formatStr</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>修改调用方法,传入属性<mytag:hello formatStr="yyyy-MM-dd"/><%--使用标签--%>
2017年11月11日
1,260 阅读
0 评论
1 点赞
1
2
3